我刚刚开始学习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
,并且此函数无法正常工作—它只添加了多达两个元素。例如,如果我将1、3、5、7推到列表中,则只会添加5和7。为什么会这样?我真的看不出任何合理的解释。2)一开始,我尝试向函数传递一个
Node
类型的参数(不像现在这样),但函数没有将任何内容放入列表。再一次,我看不出使用类型节点编写和不使用星号编写变量之间的区别。你能用外行的话跟我解释一下吗?我知道我的问题可能有一个微不足道的答案,但请理解-这是我第一次遇到指针,它们可能很难理解。
最佳答案
试着回答你的两个问题:
因为您输入def Node作为typedef struct Node* Node;
传递给add_end
的内容,因为第一个参数是指向struct Node
的双指针(就像struct Node**
)。然后使用Node help = *head;
在while循环中取消引用它,这意味着实际指针的值将发生更改。如果您没有help
指针,那么您将继续移动head
,直到到达列表的末尾。这意味着列表中只有两个元素——head本身和它的next
元素。
答案又和你的typedef有关。当您使用typedef传递Node
时,您只传递一个指向表示head的struct Node
的指针,这意味着取消引用它不会给您指向head的指针,而是给结构本身,这意味着您的if
或else
语句都不会按预期工作,因为您的目的是比较指针。
关于c - 将元素添加到有序列表的末尾,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47540072/