大话数据结构 【三】线性表3

单链表的整表删除

也就是在内存中把它释放掉

思路:

大话数据结构 【三】线性表3

大话数据结构 【三】线性表3

q变量没有存在的必要?

循环体内直接写大话数据结构 【三】线性表3即可

 

 

解释:

p是一个结点,有数据域和指针域,free(p)时,把整个结点全删了

q的作用,使下一个结点得到了记录,便于等当前结点释放后,把下一个结点拿回来补充

 

 

 

单链表结构与顺序存储结构优缺点

 大话数据结构 【三】线性表3

数据结构选择经验

大话数据结构 【三】线性表3

大话数据结构 【三】线性表3

 

静态链表

【其实就是给没有指针的高级语言设计的一种实现单链表能力的方法】

用数组描述的链表

让数组的元素都是由两个数据域组成                                【即每一个下标对应一个data和一个cur】

data ——> 存放数据元素

cur——> 存放该元素的后继在数组中的下标【相当于next指针】

 

 #为了方便插入数据,通常会把数组建立的大些【以有空闲空间,避免插入时溢出】

大话数据结构 【三】线性表3

大话数据结构 【三】线性表3#对于不提供结构struct的语言,可以使用一对并行数组data,cur处理

大话数据结构 【三】线性表3#有些是把第二个元素作为头结点,原理相同,只是取得存放位置不同

此时图示,相当于初始化数组的状态,代码:

大话数据结构 【三】线性表3

 

 假设已将数据“甲乙丙丁..”等存入静态列表

大话数据结构 【三】线性表3

 

 1.插入

 要解决的:

如何用静态模拟动态链表结构的存储空间的分配,需要时申请,不需要时释放

 操作的是数组,不存在像动态链表的结点申请 malloc()和释放 free()问题,所以,实现它

大话数据结构 【三】线性表3

大话数据结构 【三】线性表3

大话数据结构 【三】线性表3

大话数据结构 【三】线性表3

大话数据结构 【三】线性表3

 

 

 

 2.删除

 大话数据结构 【三】线性表3

大话数据结构 【三】线性表3

大话数据结构 【三】线性表3

大话数据结构 【三】线性表3

 

 

 3.优缺点

 大话数据结构 【三】线性表3

 

【学习其思路】

 

 

 

 

 

 

循环链表

大话数据结构 【三】线性表3

大话数据结构 【三】线性表3

 

解决了一个很麻烦的问题:

如何从某一个结点开始,访问到链表的全部结点

 

 为了使空链表与非空链表的处理一致,通常设一个头结点【并不是说循环链表一定要头结点】

 

解释:

      想象一下,链表就像排队入场的运动员,一个接一个的入场,第一个运动员手里举着铭牌。

      每个运动员代表一个节点。第一个运动员是头节点。铭牌是头指针。头指针不包含数据,不是节点。

      如果让运动员,从线性排队线性链表转换成环形排队(环形链表)的话,最后一个运动员应该紧靠着第一个运动员,而不是紧靠着铭牌。因为铭牌不是节点。

      链表里,形成链状的东西,是节点。每个节点链接着下一个节点,尾节点链接着头节点。虽然头指针有时候长的像个节点,但是因为它没有真实的数据,只能算作头指针,而不是节点

 循环链表带有头结点的空链表:

大话数据结构 【三】线性表3

 

 

循环链表和单链表的差异:——> 在于循环的条件判断上

单链表:判断p—>next是否为空

循环链表:判断p—>next不等于头结点,则循环未结束

 

 单链表中,有了头结点时,可以用O(1)的时间访问第一个结点,但对于访问最后一个结点需要O(n)时间

实现用O(1)时间访问到最后一个结点——>  用指向终端结点的尾指针表示循环链表

大话数据结构 【三】线性表3

 

 用尾指针实现循环链表的合并

 大话数据结构 【三】线性表3

大话数据结构 【三】线性表3

大话数据结构 【三】线性表3

 

 

 

 

 

双向链表

在单链表的每个结点中,再设置一个指向其前驱结点的指针域

 大话数据结构 【三】线性表3

大话数据结构 【三】线性表3

大话数据结构 【三】线性表3

                大话数据结构 【三】线性表3

大话数据结构 【三】线性表3

 

 很多操作和单链表相同,多了反向遍历查询等

 

在插入和删除时,要更改两个指针变量

 

插入

大话数据结构 【三】线性表3

 删除

 大话数据结构 【三】线性表3

   大话数据结构 【三】线性表3