标签:数组实现 存储结构 方式 头结点 images 优点 两个指针 处理 随机
--- 顺序存储(逻辑相邻物理相邻)-----------------------------顺序表
-
- ---单链表(指针实现)
线性表(逻辑结构) - ----双链表(指针实现)
-链式存储(逻辑相邻的但物理不)-----------------------------循环链表(指针实现)
----静态链表(数组实现)
1 表中元素个数有限
2 元素有先后测序性 逻辑相邻
3 元素类型相同 每个元素占大小相同的存储空间
4 线性表是逻辑结构 顺序表和链表都是存储结构 线性表逻辑相邻 顺序表物理相邻 链表 物理不一定相邻,线性表中每个元素除开始元素外只有一个前驱
1 头指针和头结点的区分: 不管带不带头结点,头指针始终指向链表的第一个结点,如果带头结点,则头指针指向它,通常头结点不存储信息。
头指针的意义在于,在访问链表时,总要知道链表存储在什么位置(从何处开始访问),由于链表的特性(next指针),知道了头指针,那么整个链表的元素都能够被访问,也就是说头指针是必须存在的
2 单链表添加头节点的好处:(如果带头结点的单链表 head.next()为空则链表空)
a 、 对链表头的操作 和 其他位置的操作一致,不必分情况处理,头结点和其他内部结点处理统一
b、 无论链表是否为空,其头指针是指向头结点的非空指针(空表中头结点的指针域为空),因此空表和非空表的处理统一;
3、建立单链表的方式:头插法 尾插法
4、插入结点操作也有两种方式:->p->q-> 后插 ------将 s 插到 p 后面 q前面------------------找到p插入到p后面
前插------------------------------------------------------将s插到q后面,然后 s和q交换元素信息
5、双链表:每个结点都有两个指针 指向其前驱 和 后继,尾指针的后继是NULL ,头结点的前驱是NULL,判空方法,头结点next 为NULL
6、循环链表:尾结点的next 指向头结点! 是头结点 而不是第一个结点 判空方法:head.next==head?
循环链表:
循环链表是与单链表一样,是一种链式的存储结构,所不同的是,循环链表的最后一个结点的指针是指向该循环链表的第一个结点或者表头结点,从而构成一个环形的链。循环链表的运算与单链表的运算基本一致。所不同的有以下几点:
1、在建立一个循环链表时,必须使其最后一个结点的指针指向表头结点,而不是象单链表那样置为NULL。此种情况还使用于在最后一个结点后插入一个新的结点。
2、在判断是否到表尾时,是判断该结点链域的值是否是表头结点,当链域值等于表头指针时,说明已到表尾。而非象单链表那样判断链域值是否为NULL。
双向链表 :
双向链表其实是单链表的改进。当我们对单链表进行操作时,有时你要对某个结点的直接前驱进行操作时,又必须从表头开始查找。这是由单链表结点的结构所限制的。因为单链表每个结点只有一个存储直接后继结点地址的链域,那么能不能定义一个既有存储直接后继结点地址的链域,又有存储直接前驱结点地址的链域的这样一个双链域结点结构呢?这就是双向链表。在双向链表中,结点除含有数据域外,还有两个链域,一个存储直接后继结点地址,一般称之为右链域;一个存储直接前驱结点地址,一般称之为左链域。
优缺点:
单向链表:
优点:单向链表增加删除节点简单。遍历时候不会死循环。(双向也不会死循环,循环链表忘了进行控制的话很容易进入死循环)
缺点:只能从头到尾遍历。只能找到后继,无法找到前驱,也就是只能前进。
双向链表:
优点:可以找到前驱和后继,可进可退。
缺点:增加删除节点复杂(其实就复杂一点点)
实现上的主要区别:
单向链表和双向循环链表最大的不同就是头结点是否是哑元。双向循环链表由于head是哑元,因此取元素从head的下一个结点取。单向链表:head不是哑元,第一次必须取head头结点的元素,因此循环上和双向循环链表不同。也就是第一次get并没有进入for循环,直接返回了头结点,从第二次才开始进入for循环,这里要特别注意。
一般应用中单向链表或循环链表居多,双向链表不常用。当然特殊条件下双向链表很方便。尤其是需要查询到某个节点后再查其前驱的工作中。
5、空间分配:顺序存储 如果静态分配存储空间需要预留空间,装满就不能扩充,如果未装满就造成浪费。动态分配如果没有满足的闲置空间可以分配就会分配失败
所以链式存储更灵活。
标签:数组实现 存储结构 方式 头结点 images 优点 两个指针 处理 随机
原文地址:http://www.cnblogs.com/abstract-fabulous/p/7120404.html