##前言
链表的重要性自然不用多说,往往是C语言教材的最后一章,为以后数据结构与算法的学习稍稍埋下伏笔。
链表作为一种线性表,相对于基本数据类型———数组,有其优有其劣。
拿访问方式来说,数组的访问既可以通过下标来随机访问,也可以通过指针的加减运算来进行访问,为了便于如此访问,创建数组时往往需要在内存中开辟一段连续的内存空间,否则指针“加一个、减一个”搞不好就进入了其他数据的内存领域,这是很危险的。
拿操作方式来说,如果需要快速对数据进行增添或删减,用数组实现所造成的开销也是非常昂贵的。而链表就不需要连续的内存空间,它可以提高对“碎片内存”的利用效率,创建链表的时候动态分配一块内存即可,再用指针如穿针引线般将这些内存串起来即可,访问的时候再按指针指向一个一个遍历。举个例子,如果有一个array【100】,正需要在第三个元素array【2】和第四个元素array【3】之间插入一个新的数据,那就需要array【3】以后的数据都往后移一个位置,为新人腾出地方来。有人可能会说,这样也没什么吧。对,针对小数据而言差别可能不太大,但如果数组元素个数达到1000甚至10000,这样操作的代价就非常大,此时链表的优势又一次体现出来了。
##预备知识
结构体:
先回顾一下基本数据类型
在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。总的来说,结构体是一种用户自定义类型的数据结构,用户可以按需要对基本类型进行组合,然后创建一种新的数据类型用户使用,当然也可以在结构体中包含结构体。在这里,有一种“道生一,一生二,二生三,三生万物”的智慧——你想要怎么玩你自己去组合,不要问我要数据类型了。
struct listNode
{
//数据域,存储数据
int data;
//指针域,连接下个节点
listNode *p;
}
##动手
1、链表的创建
a.头插法
b.尾插法
2、链表的查找
3、链表的删除
4、链表的反转
5、链表的排序