Этот блок кода считывает файл словаря и сохраняет его в хешированном массиве. Этот массив хеширования использует связанное разрешение столкновений списков. Но по какой-то непонятной причине чтение останавливается посередине. (я предполагаю, что некоторые проблемы возникают при создании связанного списка.) Все работает отлично, когда данные хранятся в элементе пустого хэшированного массива.Ошибка решетки, связанная с решетчатым списком решетки решетки
#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
сортирует связанный список. Пожалуйста, укажите мне проблему.
Всегда ли останавливается в одном месте при чтении? Вы пытались изолировать ввод? Вы пробовали переходить через код в отладчике, чтобы узнать, что происходит? –
он останавливается в то время, когда какое-либо слово имеет тот же самый индекс, что и предыдущее слово, а затем он проходит через инструкцию else else. И я не совсем уверен, как использовать отладчик. Но есть ли какая-то очевидная ошибка, которую вы можете увидеть здесь? –