在链表中插入

Insertion in Linked list

我正在研究如何在开头插入节点,我通过这段我无法理解的代码。
我没有得到打印功能。

typedef struct node
{
    int data;
    struct node *next;
} Node;
Node *head;
void insert(int x)
{
    Node *temp=(Node*)malloc(sizeof(Node));   
    temp->data=x;
    temp->next=head;
    head=temp;
}
void print()
{
    Node *temp=head;
    printf("List is:");
    while(temp!=NULL) //Unable to understand this statement as how will the loop terminate?                  
    {
        printf("%d ",temp->data);
        temp=temp->next;
    }
    printf("\n");
}

假设你的链表看起来像

a->b->c->d
|
|
head

所以现在我们使用一个临时变量

temp = head;

while(temp != NULL)
{
  //Keep moving temp
  printf("%d\n",temp->x);
  temp = temp->next;
}

所以 head 永远不会移动,它只是移动到列表末尾的临时指针,当我们到达 temp = NULL

时得到列表的末尾
a->b->c->d
|
|
temp = head

temp = temp->next;

    a->b->c->d
    |  |
    |  |
  head temp

重复上述移动直到 temp = NULL 当最后一个节点内容被打印时为 TRUE,我们做 temp = temp->next;

C 程序需要一个 main 函数作为开始。如果你想测试上面的代码,你需要添加一个main函数来在开始时将head初始化为NULL,多次调用insert()和print()来检查结果。

问题的缩进一团糟。

但是打印函数是:

  void print() {
      Node *temp=head;             
      printf("List is:");         
      while(temp!=NULL) {         
          printf("%d ",temp->data);
          temp=temp->next;
      }
   }

If head==NULL then temp==NULL at the start and the loop will immediately terminate.

If head!=NULL then temp!=NULL at the start and the data for head element will be output.

temp=temp->next; 将使 temp 指向列表中的下一个 Node 并且循环将继续。 如果列表中只有 Node,则循环将终止。

否则它将打印下一个元素的数据,并且 temp=temp->next 行将移动到第三个 Node(如果有)。

等等...

注意: 不推荐 Node *head; 行。它将被初始化为 NULL 因为它具有静态存储持续时间。但建议 Node *head=NULL; 用于面向未来和可读性。