当我运行下面的程序时,它打印出“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);
}
答案 0 :(得分:6)
您正在传递指向该节点的指针。与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);
P.S。由于您要在列表的前面添加{2,“2”},因此输出将为“2:2,one:1”
答案 1 :(得分:5)
head = newNode;
将无法满足您的期望。
head是按值传递的。想一想。
答案 2 :(得分:2)
在add
中,您没有将新节点连接到列表的末尾,而只是创建一个与实际列表完全断开的新节点。您也不会根据函数的签名从该函数返回int
。
我怀疑你想要用这一行将新节点设置为头部:
head = newNode;
如果是这种情况,请将head
更改为键入node**
并执行*head = newNode
,否则您只是修改一个本地变量以指向newNode
,而不是实际从head1
传递main
指针。然后,您会在main
中将&head1
传递给add
。
编辑:更有意义的是拥有head->next = newNode;
,或者迭代到列表的末尾并设置指向{的节点的next
值{1}}到NULL
。即
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"
。
答案 3 :(得分:1)
没有看到你的迭代function
,问题是head1
指向列表中的最后一个元素,而不是第一个元素。你可能意味着add函数的最后一行是:
return head;
和你的程序的第二行:
head1 = add(2, "two", head1);
但是这仍然可能会以错误的顺序给你输出,因为你的add
函数正在将新元素添加到列表的开头,而不是结尾。
答案 4 :(得分:1)
要详细了解问题,请通过The C Programming Language
- 简介(第1.7 / 1.8章)和功能与程序结构(第4章)进行Kernighan & Ritchie
。
提示:pass-by-value
& pass-by-address
int main() {
...
add(2, "two", &head1);
...
}
OTOH,您应该在取消引用之前验证malloc
的返回地址(在createNewLinkedList
中)。