将元素添加到有序列表的末尾

时间:2017-11-28 20:08:43

标签: c list

我刚刚开始学习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写入和写入没有星号的变量之间的区别。你能用外行的话向我解释一下吗?

我知道我的问题可能有一个微不足道的答案,但请理解 - 这是我第一次遇到指针而且理解它们可能相当复杂。

2 个答案:

答案 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)

试着回答你的两个问题:

  1. 因为你输入了typedef struct Node* Node;节点作为add_end的内容,因为第一个参数是指向struct Node的双指针(如struct Node**)。然后使用Node help = *head;在while循环中取消引用它。这意味着实际指针的值将会改变。如果您没有help指针,那么您将继续移动head,直到您到达列表的末尾。这意味着列表中只有两个元素 - 头部本身及其next元素。

  2. 这个问题的答案再次与你的typedef有关。当您使用typedef传递Node时,您只传递一个指向头部的struct Node的指针,这意味着取消引用它不会给您指向头部的指针,而是结构本身,这意味着您的ifelse语句都不会按预期工作,因为您的目的是比较指针。