深入解析线性表数据结构

深入解析线性表数据结构

什么是线性表

线性表是一种最常见的数据结构,比如英文字母A、B、C、D…Z就是一个线性表,一根断开的链条的各个节点也是一个线性表,电影院排队购票的人也可以组成一个线性表,线性表的特点就是组成它的数据元素之间是一种线性关系,即数据元素一个接在另一个的后面排列,每个数据元素的前面和后面都至多有一个其他数据元素,线性表又分为顺序表示和链式表示

线性表的顺序表示

线性表的顺序存储结构是指用一组地址连续的存储单元依次存储线性表的数据元素,用这种形式存储的线性表称为顺序表,因此顺序表的逻辑顺序和物理顺序是一致的,线性表中各个数据元素之间的逻辑关系可以由它们的存储地址来体现,说了这么多估计大家可能还是感觉不是太直观,不要着急下面我上个图大家一看就知道了。

图来啦

深入解析线性表数据结构_第1张图片

看到图后大家恍然大悟这不就是我们经常用的数组嘛,是的,线性表的顺序表示在我们使用中最直观的体现就是数组,这是一个长度为MAXSIZE的数组,其中index表示下标,elem是存储的数据单元。

顺序表的插入和删除

深入解析线性表数据结构_第2张图片

如上图所示,我们将这个顺序表结构中下标为n-1的元素移除,这个时候所有下标大于n-1的元素都会往前移动一位,并且会修改表的长度,同理我们如果在下标为n-1的元素之前添加一个元素,那么这个时候所有下标大于n-1的元素都会往后移动一位,并且修改表的长度。

顺序表的查找

因为顺序表在内存地址中是连续的,所以我们可以根据下标值,准确快速的取出对应的数据,如果我们不知道下标值只是找某一个数据元素的话,查找的复杂度就和这个数据在表的位置和表长有关系了。

线性链表

线性链表存储结构,它不需要用地址连续的存储单元来试下,因为它不要求逻辑上相邻的两个数据元素物理位置上也相邻,它通过“指针”建立起数据元素之间的逻关系,因此线性链表的插入、删除不需要移动数据元素,但同时也失去了顺序表的可随机存取的优点。

线性链表存储的实现

线性链表是通过一组任意的存储单元来存储线性表中的数据元素,为了建立起数据元素之间的线性关系,对每个数据元素,除了存放数据元素自身的信息之外,还要存放起后继元素的存储单元的地址,这两部分信息组成一个“结点”,结点包含两部分作用域,存放数据元素信息的域被称为数据域,存放其后继元素地址的域被称为指针域,因此多个元素的线性链表通过每个结点的指针域连接成了一个“链条”,成为链表,由于这个链表的每个结点中只包含一个指针域,因此又被称为线性链表或单链表。

闲话少说上图:
深入解析线性表数据结构_第3张图片

从上图我们可以看到,一个结点分为两块,数据域和指针域,数据域主要是存放数据单元的地方,而指针域是为了存放下个结点地址的空间。

线性链表的插入和删除

知道了什么是线性链表之后,我们来聊一下线性链表的插入和删除,看看它和线性表的顺序表示有何不同,我们假设有一个链表H 里边有三个元素A、B、C,他们的结构顺序是A指向B指向C,如果我们把B从这个链表中移除,那么它会是什么样子呢?我画了一个简单的图,我们来看一下:

深入解析线性表数据结构_第4张图片

深入解析线性表数据结构_第5张图片

第一个图是初始的结构,第二张图是移除之后的结构,从这两个图中我们不难发现,将b移除其实就是将a的指针域指向了c,并没有其他的过多的操作了,添加的话同理,添加相比删除又多了一个新节点的指针域指向下一个结点的操作,比如我们在a和b之间添加一个x结点,那么a和之前的操作一样将指针域指向了x,而x也会将自己的指针域指向了b这样就完成了一次结点的添加。

线性链表的查找

线性链表的查找和顺序表示是不同的,它需要从链表的第一个结点开始,顺着指针一个接一个的查找,查找成功则返回,未找到的话返回为空。

总结

1、顺序表的内存是预先分配的,物理地址连续易于查找,但是添加删除则比较浪费时间

2、链表结构是动态分配的,物理地址不连续,随用随加,所以它可以快速的添加、删除,但是查找较为缓慢。

3、基于空间考虑的话,因为链表除了数据之外还要保存下个结点的指针,而且从存储密度来讲,它是不经济的,因此采用顺序表即数组作为存储结构是相对合适的。

4、基于时间考虑的话,因为顺序表的物理地址是连续的,可以通过下标快速的找到对应的元素,所有对于查找比较多的操作要使用顺序表的结构来进行存储;因为链表结构的特性,它每次删除和添加都只需要修改指针即可,所以在添加和删除操作频繁的情况下要使用链表结构更为合适。

发一下感慨

最近才使用csdn写博客,操作不熟,搞了半天才了解了大概怎么操作,汗,每天也就晚上下了班有时间看看书写写博客,希望能对大家有些许帮助。
如果有什么说的不对的地方欢迎大家指正,thanks!

你可能感兴趣的:(数据结构,线性链表,数据结构,单链表)