Я собираю программу для анализа больших текстовых файлов, подсчета, сколько раз появляется каждое слово, а затем использую эти данные для других вычислений и сравнений. В настоящий момент я сталкиваюсь с проблемой, связанной с взаимодействием между моим методом hashTable insert () и токенами, которые я использую для сбора слов.
Я пытался сузить место возникновения ошибки, но я, должно быть, что-то упустил из виду, так как не могу точно определить точное местоположение.
Ниже приведен код для метода вставки:
void insert(struct table * t, char *key)
{
int pos = hashCode(t,key);
struct node *list = t->list[pos];
struct node *newNode = (struct node*)malloc(sizeof(struct node));
struct node *temp = list;
while(temp != NULL)
{
if(strcmp(temp->key, key) == 0)
{
temp->count+=1;
printf("Match found, count incremented");
return;
}
temp = temp->next;
}
newNode->key = key;
newNode->count = 1;
newNode->next = list;
t->list[pos] = newNode;
return;
}
Метод должен создать хеш-код для слова, переданного функции, затем, если хеш-код уже существует, выполнить итерацию по связанному списку и, если он найдет точное совпадение, увеличить количество этого слова. В противном случае он создает новый узел и добавляет его в хеш-таблицу.
А вот соответствующий код для метода, который я использую для анализа файла, на данном этапе разработки я просто игнорирую символы пробела для разделителя:
char delim[] = " \t\r\n\v\f";
while((nread = getline(&line, &len, fp)) != -1) {
char * token = strtok(line, delim);
printf("line grabbed. %s\n", filename);
while(token != NULL) {
printf("Tok: %s\n", token);
insert(t, token);
printf("Inserted: %s Count: %d\n", lookup(t, token)->key, lookup(t, token)->count);
token = strtok(NULL, delim);
}
}
Ошибка возникает после вызова метода вставки для дублирующего токена (т. Е. Второго экземпляра слова в файле. Вызывается оператор вставки, и он успешно распознает его как дубликат и увеличивает, но не продолжает через код до следующего оператора печати (вставленный оператор).
Вывод выглядит так:
Table created, attempting to fill.
line grabbed. t2.txt
Tok: word
Inserted: word Count: 1
Tok: word
Match found, count incremented
Может ли кто-нибудь объяснить, где я ошибся в своей реализации?
РЕДАКТИРОВАТЬ: входной файл
word word word
word