Эта программа представляет собой mcve , которая показывает, как правильно распределить и инициализировать каждый узел в вашем связанном списке:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ARRAY_SIZE(array) \
(sizeof(array) / sizeof(array[0]))
typedef struct wordFrequency {
char *word;
int frequency;
struct wordFrequency *left, *right;
} node;
node *setnode(char *word) {
node *newNode = malloc(sizeof(node));
newNode->word = malloc(strlen(word) + 1);
strcpy(newNode->word, word);
newNode->frequency = 1;
newNode->right = NULL;
return newNode;
}
int main() {
char *wordList[] = {"one", "two", "three"};
node nodeHead;
node *nodePrev = &nodeHead;
node *nodeNext;
for (int index = 0; index < ARRAY_SIZE(wordList); index++) {
nodeNext = setnode(wordList[index]);
nodePrev->right = nodeNext;
nodeNext->left = nodePrev;
nodePrev = nodeNext;
}
for (node *nodePtr = nodeHead.right; nodePtr != NULL; nodePtr = nodePtr->right) {
printf("word = %s, frequency = %d\n", nodePtr->word, nodePtr->frequency);
}
return 0;
}
выход
word = one, frequency = 1
word = two, frequency = 1
word = three, frequency = 1
Примечание
Эта программа не проверяет ошибки и не освобождает выделенную память. Этот код не должен использоваться в производственной среде.
Ответы на вопросы в комментариях
Я заменил *node
на node
в typedef
, потому что это позволяет мне объявлять экземпляры node
. Другой синтаксис позволяет указателям только на node
.
Я использую экземпляр node
вместо node *
для nodeHead
, потому что любая попытка изменить его адрес будет ошибкой.
Я использую nodePrev
для обхода списка, а также для предоставления цели для left
в возвращаемых узлах. Я инициализирую nodePrev
на &nodeHead
, потому что это начало списка. Я установил nodePrev
на nodeNext
, потому что именно так я решил просмотреть список во время инициализации. Я мог бы использовать
nodePrev = nodePrev->right;
и достиг того же эффекта.
Я реализовал обработку списка только для того, чтобы создать автономный пример, который работал бы без изменений. Вы можете смело игнорировать это.
Если вы хотите увидеть хороший код связанного списка, я рекомендую реализацию ядра Linux .