Моя программа должна взять файл из командной строки, который должен содержать список имен (не более десяти символов), за которым следует пробел, а затем возраст, все разделенные новым линий. Я должен создать хеш-таблицу размером 10, используя отдельную цепочку, с хэш-функцией h (x) = x mod 10, а затем распечатать таблицу по завершении. Я близок к тому, чтобы получить то, что хочу, но не совсем уверен в проблеме или решении.Правильное выполнение отдельной цепочки в C++
Код:
#include <iostream>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <ctype.h>
#include <stdio.h>
using namespace std;
struct node
{
char name[10];
int age;
node *next;
node()
{
memset(name, 0x0, sizeof(name));
age = 0;
next = NULL;
}
};
int main(int argc, char *argv[])
{
node **heads = new node*[10];
for (int h = 0; h < 10; h++)
heads[h] = NULL;
string currentLine;
char c;
int index = 0, fileAge, hashValue = 0;
node *current;
ifstream input(argv[1]);
if (input.is_open()) //while file is open
{
while (getline(input, currentLine)) //checks every line
{
current = new node();
istringstream iss(currentLine);
while (iss >> c)
{
if (iss.eof())
break;
if (isdigit(c))
{
current->name[index] = 0;
iss.putback(c);
iss >> fileAge;
hashValue = fileAge % 10;
current->age = fileAge;
}
else
{
current->name[index] = c;
index++;
}
}
if ((&heads[hashValue]) == NULL)
heads[hashValue] = current;
else
{
current->next = heads[hashValue];
heads[hashValue] = current;
}
}
}
for (int x = 0; x < 10; x++)
{
printf(" Index %d: ", x);
node *currentNode = heads[x];
while (currentNode != NULL && !string(currentNode->name).empty())
{
printf("%s (%d), ", currentNode->name, currentNode->age);
currentNode = currentNode->next;
}
printf("\b\b\n");
}
Вход:
Alice 77
John 68
Bob 57
Carlos 77
Ожидаемый результат:
...
Index 7: Alice (77), Bob (57), Carlos (77)
Index 8: John (68)
Index 9:
...
Фактический выход:
...
Index 7:
Index 8:
Index 9:
...
Я считаю, что есть проблема с моим обходом и как я устанавливаю «следующий» узел, но я не уверен, как это может привести к тому, что Джон будет напечатан дважды, а Боба будет удален. Я ценю любую помощь.
Как массив указателей на узлы меняет мой код? – iraxeje
@iraxeje: Указатель 'NULL' - пустой список. Чтобы вставить новый элемент в список, (1) выделить новый узел, (2) установить новый узел следующим указателем на старый указатель головы, (3) установить указатель на новый узел. Это добавляет новый узел во главе списка. –
Я изменил код и поместил его в исходное сообщение, но теперь мой вывод ничего не печатает. Почему это происходит? – iraxeje