C语言写单链表的创建、释放、追加(即总是在最后的位置增加节点)

       昨天周末给学妹讲了一些指针的知识,本来我对指针就是似懂非懂的状态,经过昨天一讲,我对指针的学习就更深刻了

果然给别人讲课也是学习的一个方法。加上最近复习数据结构,发现我的博客里没有链表的博文,所以趁这时候加上一篇。

  在此之前,我们先谈一下我要说的一些基本知识:

①函数参数为什么是双指针?

   我们先写一下这么一个程序:

# include<stdio.h>
void Gai(int m)
{
m=5;
}
int main(void)
{
int a=1;
Gai(a);
printf("%d\n",a);
return 0;
}

那么我们可以得知,输出a的值是1,为什么我调用了函数,把a传进去,并没有变成5呢?这就是关键所在。我总结一下,

形参m只是实参a的一个赋值的变量,形参我们都知道是函数调用时候才分配内存单元,当函数调用完毕后,形参就会被

干掉了,所以上面程序可以这么理解:定义一个a变量,它的值为1,当把a作为实参传进Gai这个函数时,系统会定义一个

变量m,并且把a的值“1”赋给了m,然后又执行m=5。所以,到整个程序结束,m=5,a=1,所以a的值根本就没有发生改变。

所以说,在main函数里,若想通过函数来改变变量的值,那是不可能的。

接下来我们把程序修改一下:

# include<stdio.h>
void Gai(int * m)
{
*m=5;
}
int main(void)
{
int a=1;
Gai(&a);
printf("%d\n",a);
return 0;
}

通过运行后我们可以看到a的值此时变成了“5”。所以,我们可以总结:

若一个变量想通过函数来改变本身的值,将本身作为参数传递是不成功的,只有传递本身的指针(地址)才能达到这样的效果。

 

所以后面我们创建链表时,传递的是双指针,这就是为什么参数是双指针的原因。

因为我之前也一直不明白,直到我昨天给学弟学妹们讲课的时候,我才恍然大悟,所以我也算很笨了,所以在这里给大家总结

一下,因为我在别的博客里,看到也有挺多人不理解为什么是双指针,现在希望读者们可以理解。

 

②每一个变量的内存单元中都有自己的地址

为了好理解,我画图把它绑在一块,虽然可能物理结构上不是长这样,但逻辑上是长这样的,比如
   int a=2;

C语言写单链表的创建、释放、追加(即总是在最后的位置增加节点)

  int * p = &a;

C语言写单链表的创建、释放、追加(即总是在最后的位置增加节点)

所以说,只要是变量它都会有自己的地址(指针),即使是指针变量。

然后,指针它就是用来存地址的,只有两部分,一部分是附带自己的地址,一部分是存别人的地址

 

③指针就是地址,地址就是指针,指针类型的变量它的值只用来装指针。

为什么我会说这句话呢。因为之前,在昨天为止,我那么久,居然一直都理解错了,也怪我太笨了哈哈。比如说定义了节点类型

typedef struct n
{
int data; //数据域
struct n * next; //指针域
} Node;

然后 Node * L;  我一直以为L是长这样子的

C语言写单链表的创建、释放、追加(即总是在最后的位置增加节点)

原来不是!!!  它不是!!  害死我了,以前我可纠结了好久了!!!太蠢了哈哈!!原来我一直以为什么类型的指针就长什么样!!

不是的,其实它是什么类型的指针它就存什么样的地址。而不是长成那样,所以L其实是长这样的:

C语言写单链表的创建、释放、追加(即总是在最后的位置增加节点)

 总之这个坑,如果你们已经会的,可以笑一下我,如果也一样像我一样掉坑的,希望看到这里后

能及时填坑。这个大大大大大的坑,嗨呀,气死了。都怪以前没认真学指针。

 

以上就是今天的预备知识,接下来就开始学习单链表的简单操作了。我会用图来结合,因为我一直强调图和代码结合,这样才能学好数据

结构,这样才能对数据结构有形象的想法,当然大神都是直接理解的,我高攀不起。我比较菜,就挖掘了自己的学习方法,嘿嘿。

 

单链表我采用了头指针和头结点的结构。

这次单链表的操作可能有些不一样,但原理都是一样的,或者说,把图理解了,代码也就理解了;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxzxp.html