数据结构3-链表
2016-03-21 10:41
351 查看
链表是存储许多同类型的数据元素组成的有序列表。链表如同火车,人数决定车箱数,人多就向系统申请多加一个车厢,人少就去除一个车厢。这种动态分配内存的方式,按需分配,可以避免内存的浪费。
3.1指针简介
指针是存储变量地址的变量,声明方式:
数据类型 *指针名称
动态内存分配:
就是程序在执行的时候向系统申请内存,程序运行结束应该手动释放内存。否则将会出现内存泄漏的情况。程序的执行速度较慢!
动态内存的申请:
内存的释放:
静态内存分配:编译阶段分配内存,程序结束不需要释放内存,这个动作在程序结束之后自动释放。程序的执行速度较快!
3.2 单链表(singly linked list)
单链表是链表中最常用的一种,他像火车一般,所有的结点串成一列,而且指针所指的方向一样。链表中的每个数据单元除了要存储原来的数据外还必须存储下一个数据的存储地址,所以在程序结中链表由结点组成。
简而言之,就是一个链表单元既存储数据又存储下一个链表单元的地址。
其他操作:单链表单元的结点删除,插入、单链表连接、单链表反转等。
主要思想都是前一个节点的指针指向新插入的单元结点,然后新插入单元的指针指向后一个单元的结点即可。
3.3 循环链表(circle list)
将链表尾部指针指向头部结点,则链表就是一个单循环链表。
结点插入:将新结点指针指向原链表头结点,尾部结点指针指向插入单元的结点即可。
简而言之,在循环链表中可以任意处插入新的单元,因为循环链表没有头尾之分。具体操作可以是,如果新的数据单元C插在A和B单元之间,则A单元的指针指向C的结点,C的指针指向B的结点就可以实现了。
3.4 双向链表(Double Linked List)
单链表或者循环链表只是沿着一个方向去查找数据,如果一个指针断裂,则链表就会消失无法救回。双向链表则是单元中前后两个阈存放指针,中间存放数据。其中一个指针指向前面的结点,另一个指针指向后面的结点。
结构是:
操作也有:结点插入、结点的删除等,不论如何操作都要让链表完整的连接上即可。
双链表优缺点:
优点:每个单元两个指针,分别指向前面和后面的单元,即使一根指针断裂,也能找到其他结点。不需要经过反转或者对比结点等处理,执行速度快。
缺点:双链表有两个指针,插入节点或者删除结点浪费更多的时间去移动结点。双链表中插入一个结点需要改变4个指针,删除一个结点需要改变2个指针。
3.1指针简介
指针是存储变量地址的变量,声明方式:
数据类型 *指针名称
int *p=&val;//int类型的指针p指向val;
动态内存分配:
就是程序在执行的时候向系统申请内存,程序运行结束应该手动释放内存。否则将会出现内存泄漏的情况。程序的执行速度较慢!
动态内存的申请:
数据类型 *指针名称=new 数据类型;//申请内存; 数据类型 *指针名称=new 数据类型(初始值);//申请内存,并且给指针赋予初始值;
内存的释放:
delete 指针; 指针=NULL;//将指针指向空,将内存归还给系统。
静态内存分配:编译阶段分配内存,程序结束不需要释放内存,这个动作在程序结束之后自动释放。程序的执行速度较快!
3.2 单链表(singly linked list)
单链表是链表中最常用的一种,他像火车一般,所有的结点串成一列,而且指针所指的方向一样。链表中的每个数据单元除了要存储原来的数据外还必须存储下一个数据的存储地址,所以在程序结中链表由结点组成。
简而言之,就是一个链表单元既存储数据又存储下一个链表单元的地址。
其他操作:单链表单元的结点删除,插入、单链表连接、单链表反转等。
主要思想都是前一个节点的指针指向新插入的单元结点,然后新插入单元的指针指向后一个单元的结点即可。
3.3 循环链表(circle list)
将链表尾部指针指向头部结点,则链表就是一个单循环链表。
结点插入:将新结点指针指向原链表头结点,尾部结点指针指向插入单元的结点即可。
简而言之,在循环链表中可以任意处插入新的单元,因为循环链表没有头尾之分。具体操作可以是,如果新的数据单元C插在A和B单元之间,则A单元的指针指向C的结点,C的指针指向B的结点就可以实现了。
3.4 双向链表(Double Linked List)
单链表或者循环链表只是沿着一个方向去查找数据,如果一个指针断裂,则链表就会消失无法救回。双向链表则是单元中前后两个阈存放指针,中间存放数据。其中一个指针指向前面的结点,另一个指针指向后面的结点。
结构是:
LLink Data Rlink
操作也有:结点插入、结点的删除等,不论如何操作都要让链表完整的连接上即可。
双链表优缺点:
优点:每个单元两个指针,分别指向前面和后面的单元,即使一根指针断裂,也能找到其他结点。不需要经过反转或者对比结点等处理,执行速度快。
缺点:双链表有两个指针,插入节点或者删除结点浪费更多的时间去移动结点。双链表中插入一个结点需要改变4个指针,删除一个结点需要改变2个指针。
相关文章推荐
- Python 数据结构与算法——归并排序
- Python 数据结构与算法——递归
- Python 数据结构与算法——tree(树)
- Python 数据结构与算法——列表(链表,linked list)
- 数据结构课设 旅游规划(dijkstra扩展)
- 数据结构课设 公路村村通 (最小生成树prim算法)
- 算法浅谈——数据结构
- C语言 数据结构与算法 一
- 数据结构3.1--栈的线性表示
- Python中列表、字典、元组数据结构的简单学习笔记
- 用C#学习数据结构之线性表
- 数据结构 线性表的顺序储存结构
- 二叉树的模板类实现
- 数据结构基础(六)排序
- 数据结构课设 修理牧场 (哈夫曼树基础)
- (转)java实现基本数据结构(堆,栈,链表)——推荐后面的链表扩展部分
- 二叉树的实现
- 单链表的操作
- 动态顺序表
- 数据结构课设 根据后序和中序遍历输出先序遍历