Проблема с хэш-таблицей, все имеет одинаковое значение - PullRequest
1 голос
/ 18 апреля 2011

По какой-то причине, когда я вставляю элементы в мою хэш-таблицу, все элементы с одним и тем же индексом имеют одинаковое значение.Например, если у меня есть три элемента в индексе 2 хеш-таблицы, тогда у всех трех будет то же слово, что и у последнего, вставленного в этот индекс.Я динамически распределяю память для каждого элемента перед вставкой, поэтому я не знаю проблемы.

У кого-нибудь есть подсказка?Благодарю.

 struct word{
  char *word;
  struct word *next;
}; 


struct word *hashTable[20];

void func(const char *file)
{
     char word[1000];
     int i;

     FILE *infile = stdin;
     infile = fopen(file, "rb");    
     if(infile == NULL) {
        printf("cannot open [%s]\n", file);
        return;
     }

     while(fscanf(infile, "%s" word) != EOF) {      

        struct word *w;

           w = malloc( sizeof( struct word ));
           w->word = word;           
           w->next = NULL;
           insert(w);
     }

     fclose (infile);
}

void insert(struct word *v)
{     
  if( hashTable[hash(v->word)] )
  { 
    struct word *end = hashTable[hash(v->word)];

    while(end->next != NULL ) {
      end = end->next;
    }
    end->next = v;
  }
  else
    hashTable[hash(v->word)] = v; 
}

1 Ответ

3 голосов
/ 18 апреля 2011

Это потому, что вы устанавливаете указатель word каждого struct word так, чтобы он указывал на тот же массив word (тот, который определен как локальная переменная в func). Этот массив перезаписывается каждым словом из файла, поэтому все они будут одинаковыми. Вам нужно выделить больше места для каждого массива слов, который вы хотите сохранить, и скопировать его туда. Функция strdup сделает это для вас, если вы измените ее на

w->word = strdup(word);
...