通过链接列表创建和迭代的问题?

当我运行下面的程序时,它打印出“one:1”,而不是“one:1,two:2”,正如我所料。 有谁知道这里发生了什么? 我正在尝试创建一个函数,允许我创建尽可能多的链表,而不是仅仅声明全局头。

struct Node { int value; char label[10]; node *next; }; typedef struct Node node; int add(int data, char name[], node *head) { node *newNode = (node *)malloc(sizeof(node)); if (newNode != NULL) { newNode->value = data; strcpy(newNode->label, name); newNode->next = head; head = newNode; } } node* createNewLinkedList(int d, char *name) { node *newNode = (node *)malloc(sizeof(node)); newNode->value = d; strcpy(newNode->label, name); newNode->next = NULL; return newNode; } int main() { node *head1 = createNewLinkedList(1, "one"); add(2, "two", head1); iterate(head1); } 

您正在传递指向该节点的指针。 与C中的所有参数一样,它按值传递,因此head = newNode; 对呼叫者没有影响。

您需要更改签名以接受node **head ,并添加间接级别以使add的更改反映在main

 int add(int data, char name[], node **head) { node *newNode = (node *)malloc(sizeof(node)); if (newNode != NULL) { newNode->value = data; strcpy(newNode->label, name); newNode->next = *head; *head = newNode; } } 

当然你需要将&head1传递给add方法: add(2, "two", &head1);

PS因为你在列表的前面添加{2,“2”},你的输出将是“2:2,one:1”

head = newNode; 不会做你期望的。

head是按值传递的。 想一想。

另外,您没有将新节点连接到列表的末尾,而只是创建一个与实际列表完全断开的新节点。 您也不会根据函数的签名从该函数返回一个int

我怀疑你想要用这一行将新节点设置为头部:

 head = newNode; 

如果是这种情况,请将head更改为类型node**并执行*head = newNode ,否则您只是修改一个局部变量以指向newNode ,而不是从main传递的实际head1指针。 在main您将传递&head1 add

编辑:可能更有意义的是head->next = newNode; ,或迭代到列表的末尾,并将指向NULL的节点的next值设置为newNode 。 即。

 node *lastNode = head; while (lastNode->next != NULL) /* get to the last node in the list */ lastNode = lastNode->next; lastNode->next = newNode; /* add newNode to the end of the list */ 

还有newNode->next = NULL而不是newNode->next = head 。 现在输出将是"one : 1, two: 2" ,而不是"two: 2, one : 1" ,如果你将newNode添加到头部,就会发生这种情况。

在没有看到你的迭代function的情况下,问题是head1指向列表中的最后一个元素,而不是第一个元素。 你可能意味着add函数的最后一行是:

 return head; 

和你的程序的第二行是:

 head1 = add(2, "two", head1); 

但是,这仍然可能会以错误的顺序为您提供输出,因为您的addfunction是将新元素添加到列表的开头,而不是结尾。

要详细了解这个问题,请参阅Kernighan & Ritchie The C Programming Language – 介绍(第1.7 / 1.8章)和函数和程序结构(第4章)。

提示: pass-by-value pass-by-addresspass-by-address

 int main() { ... add(2, "two", &head1); ... } 

OTOH,你应该在取消引用之前validationmalloc的返回地址(在createNewLinkedList )。