动态链表–智障般的详解(3)为什么需要二级指针

在上一章里面提到我们传到insert里面的是一个指针的地址,与其对应的在insert里面就需要一个二级指针作为input。

注意:number *start等于struct Number **start

为什么需要二级指针呢?

  1. 首先要清楚,只是要修改头指针则必须传递头指针的地址(在我们的例子里面,头指针是start)也就是二级指针,否则传递头指针即可(即头指针本身)。
  2. 这与普通的变量的道理是一样的,我们需要在sub-function改变普通变量在main的值,需要传递其地址到sub里面去。二级指针就是取的main里面的指针的地址即指针的指针。
  3. 如果我们只用一级指针,则只能修改指针所指的变量但我们需要的是改变头指针的地址,所以我们需要二级指针来改变指针的地址。
  4. 创建链表和销毁链表都需要二级指针。(因为改变了指针的地址)
  5. 与之对应的,如果我们仅仅只是要插入,删除,遍历,清空结点,一级指针就够用了。(如果有时间我可能会在最后写一下一级指针)

在我们的例子里面,我们需要的是创造一个链表,所以我们需要改变指针的地址,需要二级指针。

动态链表–智障般的详解(2)main里面的一些必要code

  • 有了结构体呢,我们开始在main里面写一些必要的code

 

 

这里我想表达的是:持续输入数字直到0停止,这里将用到while循环直到输入结束

在这里我们需要新建一个列表的头(start)并将其设置为NULL,注意这个start是被定义为一个指针的。

可以看到这里出现了insert,这是我们需要写出的一个sub-function来帮助我们添加node到list里面。在这个sub-function里面,我们需要的是输入start的地址(指针的地址,具体原因将在下一章说明)和我们需要添加到list上的值。

动态链表–智障般的详解(1)创建结构体

动态链表已经折磨了我好久,最近终于搞明白了一点点orz,以下是我认为的一些让我困惑很久的地方的解析。

如果有什么错误的地方,欢迎大家指教!

  • 首先我们需要去创建一个结构体

这是一个结构体,注意最后的分号

结构体里面包含一些你需要的数据/变量和一个必须有的同名结构体的指针,这个指针的作用是指向下一个结构体。

  • 要有一个好的代码习惯,所以我们将用到 typedef 来简化/易于修改。

首先将结构体命名为number1,然后再将结构体指针定义为number,这样将会方便我们后来要用到的二级指针。