小楼一阁的数据结构学习笔记(三、单链表)
2014-08-22 22:37
295 查看
一、什么是链表
链表是一种链式存储结构,像链条一样,是一个节点一个节点之间组成的,是一小块一小块组成的,不是一个整块的内存,每一个小块,下图是一个单链表。最简单的最基础的模型。每一个小黄色方块成为节点。数据结构分成链式存储结构和非链式存储结构。
![](http://img.blog.csdn.net/20140903095922296?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjkzNTU1MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
[b]二、顺序表和链表的区别[/b]
[b] No.1:顺序表是顺序存储结构,是申请的一整块内存,在内存中是可以通过索引来找到其中的元素的,链表不是,链表申请很多小块内存串到一起的。[/b]
No.2:各自的优劣----》顺序表因为是“一整块”,所以顺序表的元素插入和删除比较麻烦,在上一篇中已经写到了,而链表[b][b]的优势[/b]就在此,可以使用很小的资源在链表中插入和删除[/b]。
No.3:链表和顺序表贯穿整个数据结构之中,以后的很多种结构都是基于这两种结构的。
[b]三、链表的初始化、增加、删除、查找[/b]
[b][b] 链表的初始化需要作的是定义一个空的头结点,头结点一般不存放数据,这可以避免很多问题。比如插入删除是否需要考虑头结点的问题。链表的这四个操作学会之后就可以通过简易的结合组合其他的功能。[/b][/b]
[b][b]链表的节点:[/b][/b]
[b][b]链表的结构体:[/b][/b]
初始化函数:
这一句是先申请一个头结点让他的next项指向空,因为链表的最后一项都是指向空的。申请完如图:
[b][b]
![](http://img.blog.csdn.net/20140904143556994?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjkzNTU1MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
[/b][/b]
[b]增加函数:[/b]
[b][b]增加操作看图首先是两个节点[/b][/b]
![](http://img.blog.csdn.net/20140904144846203?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjkzNTU1MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
[b][b]等待插入第三个申请完的节点P[/b][/b]
![](http://img.blog.csdn.net/20140904144954513?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjkzNTU1MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
[b][b]插入了阿!!!!!首先把新节点的next指向后一个节点(顺序不能错!!!)[/b][/b]
[b][b]
![](http://img.blog.csdn.net/20140904144954359?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjkzNTU1MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
[/b][/b]
[b][b]然后拆了原来的把新的放进去!!!!让后一个节点的next指针指向新的那个,新的那个不就连上了~~~好简单有木有!!![/b][/b]
[b][b]
![](http://img.blog.csdn.net/20140904145346735?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjkzNTU1MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
[/b][/b]
连上了吧!!!下面分析代码。
非常简单的插入。大家在插入链表的时候可以这么插入,我写的是头插法。从头部第二个位置开始向里面添加数据,添加完的数据是倒过来的。大家可以从尾部插入数据。这样数据就是正过来的了。理解了上面的插入那么你就能人一的插入~
删除和查抄函数(放在了一起,即查找到要删除的内容之后然后删除掉):[b]
上图删除详解:[/b]
[b]首先三个节点:[/b]
[b]
![](http://img.blog.csdn.net/20140904150703568?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjkzNTU1MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
[/b]
[b]删了中间那个废物~~[/b]
[b]第一步让前一个指向下一个:[/b]
[b]
![](http://img.blog.csdn.net/20140904151006822?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjkzNTU1MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
[/b]
[b]然后释放了P节点,就结束了[/b]
[b]
![](http://img.blog.csdn.net/20140904151124156?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjkzNTU1MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
[/b]
[b]然后就完事了。[/b]
链表是一种链式存储结构,像链条一样,是一个节点一个节点之间组成的,是一小块一小块组成的,不是一个整块的内存,每一个小块,下图是一个单链表。最简单的最基础的模型。每一个小黄色方块成为节点。数据结构分成链式存储结构和非链式存储结构。
[b]二、顺序表和链表的区别[/b]
[b] No.1:顺序表是顺序存储结构,是申请的一整块内存,在内存中是可以通过索引来找到其中的元素的,链表不是,链表申请很多小块内存串到一起的。[/b]
No.2:各自的优劣----》顺序表因为是“一整块”,所以顺序表的元素插入和删除比较麻烦,在上一篇中已经写到了,而链表[b][b]的优势[/b]就在此,可以使用很小的资源在链表中插入和删除[/b]。
No.3:链表和顺序表贯穿整个数据结构之中,以后的很多种结构都是基于这两种结构的。
[b]三、链表的初始化、增加、删除、查找[/b]
[b][b] 链表的初始化需要作的是定义一个空的头结点,头结点一般不存放数据,这可以避免很多问题。比如插入删除是否需要考虑头结点的问题。链表的这四个操作学会之后就可以通过简易的结合组合其他的功能。[/b][/b]
[b][b]链表的节点:[/b][/b]
[b][b]链表的结构体:[/b][/b]
typedef struct list { int data; struct list *next; }List;
初始化函数:
List* InitList(List *head) { head = (List *)malloc(sizeof(List)); head->next = NULL; return head; }
这一句是先申请一个头结点让他的next项指向空,因为链表的最后一项都是指向空的。申请完如图:
[b][b]
[/b][/b]
[b]增加函数:[/b]
[b][b]增加操作看图首先是两个节点[/b][/b]
[b][b]等待插入第三个申请完的节点P[/b][/b]
[b][b]插入了阿!!!!!首先把新节点的next指向后一个节点(顺序不能错!!!)[/b][/b]
[b][b]
[/b][/b]
[b][b]然后拆了原来的把新的放进去!!!!让后一个节点的next指针指向新的那个,新的那个不就连上了~~~好简单有木有!!![/b][/b]
[b][b]
[/b][/b]
连上了吧!!!下面分析代码。
List* insertList(List *head) { List *p = NULL,*pr = head; //首先咱有一个p用来放进去的节点和一个指向当前的pr(图中有体现) char c; //这三句是循环添加节点的,链表不能就一个节点阿 printf("是否建立链表:"); scanf(" %c",&c); while (c == 'y' || c == 'Y') { p = (List *)malloc(sizeof(List)); //正式开始了!首先申请一个新的节点 scanf("%d",&p->data); //把节点的数据放进去 p->next = pr->next; //插入~~ pr->next = p; printf("是否建立链表:"); scanf(" %c",&c); } return head; }
非常简单的插入。大家在插入链表的时候可以这么插入,我写的是头插法。从头部第二个位置开始向里面添加数据,添加完的数据是倒过来的。大家可以从尾部插入数据。这样数据就是正过来的了。理解了上面的插入那么你就能人一的插入~
删除和查抄函数(放在了一起,即查找到要删除的内容之后然后删除掉):[b]
上图删除详解:[/b]
[b]首先三个节点:[/b]
[b]
[/b]
[b]删了中间那个废物~~[/b]
[b]第一步让前一个指向下一个:[/b]
[b]
[/b]
[b]然后释放了P节点,就结束了[/b]
[b]
[/b]
[b]然后就完事了。[/b]
List* deleteList(List *head) { int e; char c; List *p,*pr; //永远让p指向要删除的节点,让pr指向要删除的前一个 printf("\n是否删除节点:"); //同样的循环删除 scanf(" %c",&c); while (c == 'y' || c == 'Y') { p = head->next,pr = head; //查找之前让p和pr摆放好位置 printf("请输入要删除的数据:"); scanf("%d",&e); while (p) { //查找 if (p->data == e) { //查找到了 pr->next = p->next; //图中样子删除 free(p); //释放 break; } if (p->next == NULL && p->data != e) { //没找到的处理 printf("没找到\n"); } pr = p; //俩节点找过程中向前移动,记住保持pr是p前一个节点 p = p->next; } printf("是否删除节点:"); scanf(" %c",&c); } return head; }单链表完成。
相关文章推荐
- 小楼一阁的数据结构学习笔记(开始篇)
- 小楼一阁的数据结构学习笔记(二、顺序表)
- 【C++数据结构学习笔记---线性表】用单链表实现线性表
- 数据结构学习笔记三 循环链表及双向链表
- 数据结构学习笔记 --- 线性表 (双向链表、循环链表)
- 数据结构学习笔记1-线性表(顺序表,单链表)
- 数据结构学习笔记(3.线性表之静态链表及柔性数组)
- 数据结构 链表学习笔记
- 数据结构学习笔记3(链表 下 双向链表&单链表逆转)
- 数据结构学习笔记-链表
- python数据结构学习笔记-4-链表
- 数据结构学习笔记之一:链表
- 数据结构学习笔记--(3) 链表--第一节
- 【C++数据结构学习笔记---线性表】带头结点的双向循环链表
- 数据结构学习笔记 --- 线性表 (单链表)
- 数据结构学习笔记之链表分析与实现(一)
- 【C++数据结构学习笔记---栈】用链表实现栈
- 数据结构学习笔记--(4) 链表--第二节
- 数据结构学习笔记1-链表反转(递归与非递归)
- 数据结构 链表学习笔记 2