《大话数据结构》--学习笔记7

3.6 线性表的链式存储结构

3.6.1 顺序存储结构不足的解决方法

前面我们讲的线性表的顺序存储结构。它是有缺点的,最大的缺点是:插入和删除时需要移动大量元素,这显然需要耗费时间。能不能想办法解决?

要解决这个问题,我们就得考虑一下导致这个问题的原因:

为什么插入和删除时,就要移动大量元素,仔细分析,发现原因就在于相邻两元素的存储位置也具有相邻关系。它们的编号是1,2,3,...,n它们在内存中的位置也是挨着的,中间没有空隙,当然就无法快速介入,而删除后,当中就会留出空隙,自然也需要弥补。问题就在这里.

A同学思路:让当中每个元素之间都留有一个空位置,这样插入时,就不至于移动。可一个空位置如何解决一个位置插入多个数据的问题?所以此次不通!

B铜须思路:那就让每个元素之间都留有足够多的位置,根据实际情况制定空隙大小,比如10个,这样插入时不需移动。万一用完这10个位置,再考虑移动使得每个位置间都有10个空位置。但是对于超过10个同样位置的数据的插入,效率上还是存在在问题。对于数据的遍历,也会因为空位置太多而造成判断时间上的浪费而且复杂度还增加了,因为每个元素之间有若干个空位。

C同学思路:反正也是让相邻元素之间留足够余地,那干脆所有的元素都不要考虑相邻位置了,哪有空位置就到哪,而只是让每个元素知道它下一个元素的位置在哪,这样,我们可以在第一个元素时,就知道第二个元素的位置(内存地址),而找到它;在第二个元素时,再找到第三个元素的位置(内存地址)。这样所有的元素我们就可以通过遍历而找到了。

    好!这个想法非常好,C同学,如果晚生几十年,这个想法,对于数据结构来说就是划时代意义了。 C同学的这个思路,就是我们下面的链式存储结构

3.6.2 线性表链式存储结构定义

    以前在顺序结构中,每个数据元素只需要存数据元素信息就可以了。现在链式结构中,除了要存数据元素信息外,还要存储它的后续元素的存储地址。

    因此,为了表示每个数据元素ai与其直接后续数据元素ai+1之间的逻辑关系,对数据元素ai来说,除了存储其本身的信息之外,还需存储一个其之间后续的存储位置。

我们把存储数据元素信息的域称为数据域把存储直接后续位置的域称为指针域

这两部分信息组成的数据元素ai的存储映像,称为结点(Node)

    n个结点(ai的存储映像)链接成一个链表,即为线性表(a1,a2,a3,...,an)的链式存储结构,因为此链表的每个结点中只包含一个指针域,所以叫做单链表。单链表正是通过每个结点的指针域将线性表的数据元素按其逻辑次序链接在一起。

    链表中的第一个结点的存储位置叫做头指针

    线性链表的最后一个结点指针为“空”(通常用NULL或“^”符号表示)[意味着后续不存在]

     

单链表的第一个结点前附近设一个结点,称为头结点。头结点的数据域可以不存储任何信息,谁叫它是第一个呢,有这个特权,也可以存储如线性表的长度等附加信息,头结点的指针域指向第一个结点的指针;

3.6.3 头指针与头结点的异同

头指针头结点
头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针头结点是为了操作统一和方便而设立的,放在第一元素的结点之前,其数据域一般无意(也可存放链表的长度)
头指针具有标识作用,所以常用头指针冠以链表的名字有了头结点,对在第一元素结点前插入结点和删除第一结点,其操作与其它结点的操作就统一了
无论链表是否为空,头指针均不为空。头指针是链表的必要元素头结点不一定时链表必须要素

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值