我正在尝试用C编写一个LinkedList。这是我的两个结构
struct node{
int key;
int value;
struct node *next;
};
struct LinkedList {
struct node *head;
};
这是我创建新节点的方法。
void createNode(int key, int value) {
struct node *new_node;
new_node->key = key;
new_node->value = value;
new_node->next = lList->head;
lList->head = new_node;
}
我正在尝试使用以下函数遍历链接列表。
void traverseNode(struct LinkedList *lList) {
struct node current = *lList->head;
while(current != NULL) {
printf("%i", current->key);
current = current->next;
}
}
但是,我不断收到一个错误说
invalid operands to binary expression ('struct node'
and 'void *')
关于我的while
表达。
另外,我收到一个错误
printf("%i", current->key);
current = current->next
错误是
成员引用类型"结构节点"不是指针; 也许你的意思是使用".">
我很困惑,因为我认为在我的节点结构中,*next
被定义为指针,因此只能使用间接(->(语法访问。
我是指针的初学者,因此任何帮助都值得赞赏。
您无法将NULL
与非指针类型进行比较。
将变量current
声明为指针 + 删除head
的取消引用,它将编译
struct node * current = lList->head;
^ ^
while(current != NULL) // Now you can compare them
您正在获得 SEGFAULT,因为您正在取消引用未初始化的指针。在堆上分配足够的内存(动态存储持续时间(。
struct node *new_node = malloc(sizeof(struct node));
由于current
是指针
printf("%i", current->key);
current = current->next;
现在应该没事了。
由于错误状态,电流是一个结构,而不是指针
将其更改为struct node *current = lList -> head;
请记住,指针本身没有引用对象的存储
do{
printf("%i", current->key);
current = current->next;
} while(current != NULL)
这样做将通过查看下一个节点是否为 null 而不是整个结构来检查您是否在最后一个节点上
void createNode(int key, int value) {
struct node *new_node; // you need to malloc here
new_node->key = key;
new_node->value = value;
new_node->next = lList->head;
lList->head = new_node;
}
在访问指针之前,必须进行 malloc。
struct node *new_node = (struct node*)malloc(sizeof(struct node));
也改变像,
struct node current = *lList->head;
到
struct node *current = *lList->head;