У меня следующая структура данных:
typedef struct Word {
char *word;
int occur;
struct Word *next_word;
} * WordList;
Я пытаюсь реализовать функцию, которая добавляет строку (слово) к WordList
.Если он уже присутствует в списке, увеличьте его вхождения, в противном случае добавьте его в заголовок.Эта функция также возвращает вхождения указанного слова в списке.
Ниже приведена моя реализация:
#include <stdlib.h>
#include <string.h>
int addAtHead(WordList *w, char *word) {
WordList head = *w;
while (*w && strcmp((*w)->word, word) != 0)
w = &(*w)->next_word;
if (!*w) {
WordList new = malloc(sizeof(struct Word));
size_t length = strlen(word) + 1;
new->word = malloc(length);
memcpy(new->word, word, length);
new->occur = 0;
new->next_word = head;
*w = new;
}
return ++(*w)->occur;
}
У меня есть следующие функции для проверки предыдущей:
#include <stdio.h>
void printWordList(WordList w) {
for ( ; w; w = w->next_word)
printf("Word: %s\nOccurrences: %d\n\n",
w->word, w->occur);
}
int main(void) {
WordList w = NULL;
addAtHead(&w, "world");
addAtHead(&w, "hello");
printWordList(w);
return 0;
}
Когда я компилирую и запускаю исполняемый файл, я получаю такой результат:
> Word: world Occurrences: 1
>
> Word: hello Occurrences: 1
>
> Word: world Occurrences: 1
>
> Word: hello Occurrences: 1
>
> Word: world Occurrences: 1
>
> Word: hello Occurrences: 1
и так далее, и так далее.
Я предполагал, что где-то в моем коде я связываю последнийэлемент к первому, поэтому я нарисовал следующие диаграммы, чтобы выяснить, где это происходит.
Затем я предположил, что проблема заключается в строке *w = new;
.Как мне снова установить *w
для начала списка, не создавая циклический список?