2013-05-02 3 views
0

Этот блок кода считывает файл словаря и сохраняет его в хешированном массиве. Этот массив хеширования использует связанное разрешение столкновений списков. Но по какой-то непонятной причине чтение останавливается посередине. (я предполагаю, что некоторые проблемы возникают при создании связанного списка.) Все работает отлично, когда данные хранятся в элементе пустого хэшированного массива.Ошибка решетки, связанная с решетчатым списком решетки решетки

#define SIZE_OF_ARRAY 350 
typedef struct { 
    char* key; 
    int status; // (+1) filled, (-1) deleted, 0 empty 
    LIST* list; 
}HASHED_ARRAY; 
void insertDictionary (HASHED_ARRAY hashed_array[]) 
{ 
    //Local Declaration 
    FILE* data; 
    char word[30]; 
    char* pWord; 
    int index; 
    int length; 
    int countWord = 0; 

    //Statement 
    if (!(data = fopen("dictionaryWords.txt", "r"))) 
    { 
     printf("Error Opening File"); 
     exit(1); 
    } 

    SetStatusToNew (hashed_array); //initialize all status to 'empty' 

    while(fscanf(data, "%s\n", word) != EOF) 
    { 

     length = strlen(word) + 1; 
     index = hashing_function(word); 

     if (hashed_array[index].status == 0)//empty 
     { 
      hashed_array[index].key = (char*) malloc(length * sizeof(char));//allocate word. 
      if(!hashed_array[index].key)//check error 
      { 
       printf("\nMemory Leak\n"); 
       exit(1); 
      } 
      strcpy(hashed_array[index].key, word); //insert the data into hashed array. 
      hashed_array[index].status = 1;//change hashed array node to filled. 
     } 

     else 
     { 
      //collision resolution (linked list) 
      pWord = (char*) malloc(length * sizeof(char)); 
      strcpy (pWord, word); 

      if (hashed_array[index].list == NULL) // <====== program doesn't enter 
              //this if statement although the list is NULL. 
           //So I'm assuming this is where the program stops reading. 
      { 
       hashed_array[index].list = createList(compare); 
      } 
      addNode(hashed_array[index].list, pWord); 
     } 
     countWord++; 
     //memory allocation for key 
    } 
    printStatLinkedList(hashed_array, countWord); 
    fclose(data); 
    return; 
} 

createList и addNode оба ADT функция. Former принимает указатель на функцию (compare - функция, которая я строю внутри функции main) в качестве параметра, а последняя принимает имя списка и данные типа void как параметры. compare сортирует связанный список. Пожалуйста, укажите мне проблему.

+0

Всегда ли останавливается в одном месте при чтении? Вы пытались изолировать ввод? Вы пробовали переходить через код в отладчике, чтобы узнать, что происходит? –

+0

он останавливается в то время, когда какое-либо слово имеет тот же самый индекс, что и предыдущее слово, а затем он проходит через инструкцию else else. И я не совсем уверен, как использовать отладчик. Но есть ли какая-то очевидная ошибка, которую вы можете увидеть здесь? –

ответ

1

В зависимости от того, где вы декларируете hashed_array, вы перейдете к этой функции, содержимое которой может быть не инициализировано. Это означает, что все содержимое всех записей является случайным. Это включает указатель list.

Необходимо сначала инициализировать этот массив. Самый простой способ заключается в простом использовании memset:

memset(hashed_array, 0, sizeof(HASHED_ARRAY) * whatever_size_it_is); 

Это установит все члены к нулю, то есть NULL для указателей.