我在C中有一个函数,它应该为链表创建3个节点。问题是该函数似乎添加了一个额外的节点,我无法发现我的错误。有人可以看看输出和代码,让我知道我的错误是什么?问题可能出在虚拟机编译环境中吗?我在运行BackTrack Linux的虚拟机中使用以下代码进行编译:
gcc link.c -o link
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define DELIMITER ,
struct node {
int data;
struct node *next;
};
struct node* create()
{
//define head pointers
struct node *head = NULL;
struct node *second = NULL;
struct node *third = NULL;
//allocate memory
head = malloc(sizeof(struct node));
second = malloc(sizeof(struct node));
third = malloc(sizeof(struct node));
//setup fields
//assign links
head->data = 15;
head->next = second;
second->data = 20;
second->next = third;
third->data = 25;
third->next = NULL;
return head;
}
int main(int argc, const char *argv[])
{
int size;
struct node *head;
head = create();
struct node *curr = head;
while(curr->next != NULL)
{
printf("%d\n", curr->data);
curr++;
}
return 0;
}
这是输出:
15 0 20 0
答案 0 :(得分:1)
使用链表时,curr ++不能像在标准数组中那样工作。链表的整个要点是列表中的数据不是连续的。您不能简单地增加curr并期望它指向列表中的下一个元素,因为malloc不承诺顺序调用将返回内存的连续单元格的地址。
您正在寻找的是
curr = curr->next;
但是,这也需要您修改循环。由于curr-&gt; next将在最后一个节点之前为NULL,因此将跳过最后一个元素。你在条件
curr->next != NULL
经过上述调整后,应
curr != NULL
此外,malloc返回void指针,虽然没有必要,但我会说你应该将它们转换为正确的指针类型。
//allocate memory
head = (struct node*) malloc(sizeof(struct node));
second = (struct node*) malloc(sizeof(struct node));
third = (struct node*) malloc(sizeof(struct node));
答案 1 :(得分:0)
while(curr)
{
printf("%d\n", curr->data);
curr = curr->next;
}
我更喜欢
for(curr = head; curr ; curr = curr->next)
{
printf("%d\n", curr->data);
}