我刚刚开始学习C中的动态结构。 我想要学习的第一种类型是有序列表。我创建了一些函数 - 即将节点添加到列表的开头并打印列表中的元素,但后来我决定编写一个允许我在列表末尾添加元素的函数。我的功能如下:
typedef struct Node* Node;
void add_end(Node *head, int value) {
Node new;
new = malloc(sizeof(struct Node));
new -> value = value;
new -> next = NULL;
if(*head == NULL) {
*head = new;
}
else {
Node help = *head;
while(help->next != NULL) {
help = help->next;
}
help->next = new;
}
}
一些澄清:我的结构由两个字段组成 - value(int)和next(指向下一个节点的指针)。
因此,我的问题是:
1)注意我使用名为“help”的变量进行替换 - 当我尝试在没有它的情况下执行此操作时,即在*head
出现help
时写Node
,此函数无法正常工作 - 它仅添加为多为两个要素。例如,如果我将1,3,5,7推入列表,则只会添加5和7。为什么会这样?我真的看不出任何合理的解释。
2)起初我尝试将类型Node*
的参数传递给函数(Not ms
,正如我现在所做的那样)并且该函数没有将任何内容放入列表中。再一次,我看不出使用类型Node写入和写入没有星号的变量之间的区别。你能用外行的话向我解释一下吗?
我知道我的问题可能有一个微不足道的答案,但请理解 - 这是我第一次遇到指针而且理解它们可能相当复杂。
答案 0 :(得分:1)
你的功能类型应该是:
void add_end(Node **head, int value) {
^
因为head
是指向Node
像:
void add_end(Node **head, int value) {
Node* new; // NOTICE Node*
new = malloc(sizeof(struct Node));
// TODO - add check for new being NULL
new -> value = value;
new -> next = NULL;
if(*head == NULL) {
*head = new;
}
else {
Node help = *head;
while(help->next != NULL) {
help = help->next;
}
help->next = new;
}
}
并称之为:
Node* head = NULL;
add_end(&head, 42);
add_end(&head, 42);
add_end(&head, 42);
答案 1 :(得分:1)
试着回答你的两个问题:
因为你输入了typedef struct Node* Node;
节点作为add_end
的内容,因为第一个参数是指向struct Node
的双指针(如struct Node**
)。然后使用Node help = *head;
在while循环中取消引用它。这意味着实际指针的值将会改变。如果您没有help
指针,那么您将继续移动head
,直到您到达列表的末尾。这意味着列表中只有两个元素 - 头部本身及其next
元素。
这个问题的答案再次与你的typedef有关。当您使用typedef传递Node
时,您只传递一个指向头部的struct Node
的指针,这意味着取消引用它不会给您指向头部的指针,而是结构本身,这意味着您的if
或else
语句都不会按预期工作,因为您的目的是比较指针。