Проблема с вставкой токена в Hashtable - PullRequest
1 голос
/ 22 марта 2019

Я собираю программу для анализа больших текстовых файлов, подсчета, сколько раз появляется каждое слово, а затем использую эти данные для других вычислений и сравнений. В настоящий момент я сталкиваюсь с проблемой, связанной с взаимодействием между моим методом 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 


...