2014-11-09 1 views
1

Моя программа должна взять файл из командной строки, который должен содержать список имен (не более десяти символов), за которым следует пробел, а затем возраст, все разделенные новым линий. Я должен создать хеш-таблицу размером 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: 
... 

Я считаю, что есть проблема с моим обходом и как я устанавливаю «следующий» узел, но я не уверен, как это может привести к тому, что Джон будет напечатан дважды, а Боба будет удален. Я ценю любую помощь.

ответ

2

Есть несколько вещей, которые я могу видеть сразу:

  • Ваш heads массив представляет собой массив узлов, но это должен быть массив указателей на узлы:

    node **heads = new node *[10]; 
    

    (не забудьте инициализировать все указатели до NULL).

  • В случае, когда вы добавляете что-то список, который уже имеет элемент, вы в конечном итоге вызова new node дважды (один раз для current и один раз для next). Это не так. Вы добавляете только один узел.

+0

Как массив указателей на узлы меняет мой код? – iraxeje

+0

@iraxeje: Указатель 'NULL' - пустой список. Чтобы вставить новый элемент в список, (1) выделить новый узел, (2) установить новый узел следующим указателем на старый указатель головы, (3) установить указатель на новый узел. Это добавляет новый узел во главе списка. –

+0

Я изменил код и поместил его в исходное сообщение, но теперь мой вывод ничего не печатает. Почему это происходит? – iraxeje