我刚刚开始学习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的指针,而是给结构本身,这意味着您的ifelse语句都不会按预期工作,因为您的目的是比较指针。

关于c - 将元素添加到有序列表的末尾,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47540072/

10-16 11:11
查看更多