链表的组成部分以及和顺序存储结构的区别

线性表

线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。而链表是属于线性表中的链式存储结构,除了链式存储结构外,还有顺序存储结构,他们共同组成了线性表。

顺序存储结构

先来简单的介绍一下顺序存储结构,其实在学过c语言的各位已经对顺序存储结构十分熟悉了。举个简单的例子,我们经常使用的数组就是属于顺序存储结构。数组就是一个十分典型的顺序存储结构。他在存储数据时体现了顺序两个字,他们的存储空间是连续的。存储的地址是相邻的。如下图所示:
顺序存储结构的内存存储特点

他们在内存中的地址是连续的,这就决定了顺序存储结构的一些特点。第一:无须为表示表中元素之间的逻辑关系而增加额外的存储空间。 第二:可以快速的存取表中任意位置的元素。第三:顺序存储结构的长度一旦确定就很难改变。第四:当对线性表中的元素进行插入和删除操作时,如果元素处于中间位置将要对要操作元素后面的每一个进行后移或者前移的操作。
这种特点在数据不容易发生改变和数据规模已经固定的情况下是十分合适的。但是,在现实情况中,数据具有着很大的不确定性,我们经常需要对数据进行修改和移动更换。在这个时候,顺序存储结构的缺点也就显示出来了。在顺序存储结构中,如果需要对数据进行插入,删除操作时,必须移动大量的元素。同时,当线性表的长度变化较大时。就难以确定存储空间的存储量。如果开的空间过小就会导致数据无法全部存放,如果过小,就容易造成存储空间的碎片化(极易浪费空间)。在这种时候,顺序存储结构就已经无法满足人们的需求了。链式存储结构也就孕育而生了。

链式存储结构

链表内存存储结构

那么,什么是链式存储结构呢?
链表,别名链式存储结构或者单链表,用于存储逻辑关系为‘一对一’的数据,与顺序存储结构不同,链表因为其独特的特点,不限数据的物理存储状态。链表在地址的空间存储上和顺序存储结构有着很大的区别。最大的特点就是链表的地址空间不是连续的。在一定程度上,他们是属于不同地址空间的。他就像一条线,将这些地址给串在了一起。举个例子,如下图所示:
链式存储结构
这是一个链表,他存储的数据是{1,2,3,4,5}在这种图中可以看出来,在每个元素之间都用了一条线来连接。这条线就是链式存储结构的重点所在了。这条线其实是一个指针。指针所指向的就是后继节点(在链表中当前的节点的后面一个节点叫做后继节点,当前节点的前面一个节点叫做前继节点)的地址。让我们来看一下这个链表中在内存地址是如何存放的:
链表的内存存储结构
可以看出链表之间的地址是不连续的,但是他们的地址是逐渐增大的。每个元素之间通过指针来相互连接起来。

链表的组成

结点

接下来让我们了解一下链表的结构。链表是由一个个结点来组成。从上图可以看出,一个结点的组成中不仅有着存放的数据还有一个指针。所以,链表中每一个数据的存储都由一下两部分组成:

1.数据元素本身,其所在的区域称为数据域
2.指向直接后继节点的指针,所在区域称为指针域
即结点的结构如下图所示:
结点的组成
每一个结点在c语言中都是一个结构体,一般情况下我们会定义一个结点结构体:代码如下:

 typecdef struct Link{
	char Elem;   //表示数据域,用来存储数据
	struct Link *next;   //表示指针域,用来指向下一个结点的内存地址。
}link; 

头节点,头指针和首元节点

接下来我们还要去了解一下头节点,头指针和首元节点
一个完整的链表不知需要结点,同时还要需要头节点,头指针和首元结点

1.头指针:头指针其实就是一个正常的指针,不过头指针是永远都是指向链表的第一个结点的位置。头指针能很好的帮助指明链表的位置。
2.头节点:链表中的第一个结点就称为头节点
3.首元结点:当头节点是空结点的情况下,链表中第一个存有数据的结点就称为首元接结点。目前看来并没有什么实质意义
一个完整的链表就可以如下图所示:
链表

两种存储结构的特点

在了解了链表的结构和组成部分后,我们就可以知道链表究竟对我们有什么好处。接下来就列出两种存储结构的特点:

1、在存储分配方式上
(1)顺序存储结构用一段连续的存储单元一次存储线性的数据元素
(2)单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素

2、在时间性能上

(1)查找
①顺序存储结构 O(1)
②单链表 O(n)
(2)插入和删除
①顺序存储结构需要平均移动表长的每一个元素,时间为O(n)
②单链表在计算出某一个位置的指针后,插入和删除的时间为O(1)

3.空间性能
①顺序存储结构需要分配的空间过大
②单链表不需要分配存储空间,需要就可以直接分配,元素个数也不受限制

通过上面的特点可以知道,链表在一定程度拥有着很大的‘自由’,他可以随时对链表进行延长,同时在插入和删除等操作上更优于顺序存储结构。但是不同的地方是,在链表中存照元素就必须从头节点开始不断的向后寻找直至找到所需要的元素。这也是链表的一大缺点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值