代码说明(链表C)

Sha*_*ars 11 c linked-list head

这不是我的代码.我把这个代码从这个网站上删除了:

http://www.macs.hw.ac.uk/~rjp/Coursewww/Cwww/linklist.html

我正在使用有关如何构建链表的参考资料.我对发生的事情感到有些困惑.有人可以向我解释发生了什么事.我会用1-5来标记令我困惑的事情.

#include<stdlib.h>
#include<stdio.h>

struct list_el {
   int val;
   struct list_el * next;
};

typedef struct list_el item;

void main() {
   item * curr, * head;
   int i;

   head = NULL;   //1

   for(i=1;i<=10;i++) {
      curr = (item *)malloc(sizeof(item));
      curr->val = i;
      curr->next  = head; //2
      head = curr; //3
   }

   curr = head; // 4

   while(curr) {  //5
      printf("%d\n", curr->val);
      curr = curr->next ;
   }
Run Code Online (Sandbox Code Playgroud)
  1. head = NULL→为什么head被设置为NULL?我知道你应该(我是出于习惯),但我不知道为什么.

  2. curr-> next = head→我也从未真正理解过这一点.也许我对"head"的定义错了,但是在常规链表中,它是列表中的起始节点还是最后一个节点?我一直认为它是起始节点,但在这一行中它看起来像是最后一个节点.

  3. head = curr→为什么我们将它设置为curr?

  4. curr = head→然后在循环完成后设置curr = head.

  5. 虽然(curr)→只是为了确保,这是遍历列表,它相当于while(curr!= NULL)对吗?

mel*_*kim 20

#1: head = NULL

初始化指针.它通常推荐初始化指针或者(1)在声明或(2)的声明之后立即为NULL.如果程序员错误地取消引用未初始化的指针,则返回垃圾值.如果静态分析器和编译器没有显示未初始化指针的警告或错误消息,通常很难调试.

有关更多信息,请参阅Steve McConnell的代码完成:软件构建实用手册防御性编程的维基百科页面.

#2: curr->next = head

构建链表.该curr节点与序列中先前创建的节点"链接".

#3: head = curr

更新头指针.head指针被更新为指向最近malloc编节点.

下面的插图可视化步骤#2和#3:

第一 第二 第三 最后的

#4: curr = head

重新初始化指针.此步骤类似于步骤#2 : curr->next = head. 通过将currnode 设置为head,currwhile循环中的链表遍历"准备好" .从类比来说,它就像在循环开始时将迭代变量初始化为0(即i = 0).要显示此步骤,请参阅下面的插图,显示执行此语句之前/之后:

之前

后

#5: while(curr)

遍历清单. 鉴于它curr指向第一个节点(来自步骤#4),此while循环遍历列表直到curr->next返回NULL.在一个不太抽象的形式中,我们可以将此语句重写为while(curr != NULL).


Pau*_*lin 5

  1. 头指向列表的头部.由于列表当前为空,因此将其设置为null
  2. 将节点添加到列表时,将"next"指针设置为列表的当前头部.将新节点放在列表的头部.
  3. 将"head"设置为"curr"以使新节点成为列表的头部.
  4. 循环结束后,您将重新使用"curr"变量遍历列表.
  5. 您将依次通过列表设置"curr"到每个节点,直到您离开列表的底部(其中curr-> next为null)