您的位置:首页 > 理论基础 > 数据结构算法

数据结构3-链表

2016-03-21 10:41 351 查看
链表是存储许多同类型的数据元素组成的有序列表。链表如同火车,人数决定车箱数,人多就向系统申请多加一个车厢,人少就去除一个车厢。这种动态分配内存的方式,按需分配,可以避免内存的浪费。

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个指针。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: