首页 > 编程知识 正文

解学习数据结构 顺序表原来还可以这样玩

时间:2023-05-04 22:40:50 阅读:199819 作者:4941

小发言

写数据结构系列的文章原因:
正是因为我发现自己对于基本的东西都太不懂。大大小小的比赛也没少玩,代码也写了不少,但始终没有突破,到头却发现自己对于基本的知识都掌握的不扎实,真可悲!
数据结构系列文章的亮点:
通过图形化的学习,对每一种算法用图解的方式展开讲解,这样不仅可以剔除掉纯算法的枯燥乏味,而且还便于理解。本系列文章所有的代码本人都会验证通过,并且后期会在leetcode上选取合适的例题进行实际训练。

线性表介绍

线性表是数据结构中的一种存储结构,通俗点来说,就是把所有数据串成一串,然后在存储到物理空间中。

例如,对于数据
1 , 2 , 3 , 4 , 5 1 ,2,3,4,5 1,2,3,4,5
要将其存储到一段空闲的物理空间中,通常有如下两种存法:

数据集中存放

这种存放方式也是大家经常使用的一种存放方式,大多数人最容易想到。

数据分散存放

这种存放方式在物理地址空间上看似乱序且不连续,但是当我们按照原先的线性顺序依次遍历时,数据的顺序并不会因物理地址空间的乱序和不连续而出现差错,这也正是线性表的独特之处——用一根线把它们按照顺序串起来 。

顺序存储结构

上面我们介绍了两种存放方式,而第一种数据集中存放,即将数据依次存储在连续的整块物理空间中,这种存储结构称为顺序存储结构(简称顺序表)。可见,顺序表和数据非常相似,我们可以将其与数据类比学习

顺序表的初始化

首先,需要申请足够大小的物理空间,而且为了方便后期使用表中的数据,顺序表还需要实时记录顺序表申请的存储容量和顺序表的长度,也就是表中存储数据元素的个数。
首先,先定义一个顺序表

typedef struct Se_Table{ int * head;//head为一个长度不确定的数组 int length;//当前顺序表的长度 int size;//顺序表分配的存储容量,即顺序表的大小}se_table;

注意:这里的head是一个未初始化的动态数组,用来存储顺序表中的数据,前往不要只把它看做是普通的指针。
然后就是顺序表的初始化,分两步完成:

给 head 动态数据申请足够大小的物理空间(一般情况下,顺序表申请的存储容量要大于顺序表的长度,这样会避免一些数组越界的问题);给 size 和 length 赋初值; //顺序表初始化se_table init(){ se_table t; t.head=(int*)malloc(5*sizeof(int));//构造一个空的顺序表,动态申请存储空间 if (!t.head) //如果申请失败,作出提示并直接退出程序 { printf("初始化失败"); exit(0); } t.length=0;//空表的长度初始化为0 t.size=5;//空表的初始存储空间为5 return t;}

对上面提到的这两句代码,

t.length=0;//空表的长度初始化为0t.size=5;//空表的初始存储空间为5

很多小伙伴可能不理解,长度初始化都为0了,存储空间却为5。其实这两者是互不相关的,初始空间为5,说明我向计算机预先申请了大小为5的存储空间,即t.size=5;,但在这个5存储空间里并没有存储任何数据,因此它的长度就为0,即t.length=0;

这样我对顺表的初始化已经完成,通过改变size 的大小,我们可以改变预先申请的存储空间大小,接下来,我们就可以对顺序表进行操作了。在主函数添加代码,往顺序表中添加数据
1 , 2 , 3 , 4 , 5 1,2,3,4,5 1,2,3,4,5并打印

int main(){ se_table t=init();; //向顺序表中添加元素 for (int i=1; i<=5; i++) { t.head[i-1]=i; t.length++; } printf("顺序表中存储的元素分别是:n"); for (int i=0;i<t.length;i++) { printf("%d ",t.head[i]); } printf("n"); return 0;}

输出如下

顺序表的插入

几乎所有的数据结构都有插入操作,对于顺序表来说,可以根据插入的位置不同分为三种情况:

表头插入表尾插入在表中插入

虽然数据元素插入顺序表中的位置有所不同,但我们都是使用的是同一种方式去解决,即:通过遍历,找到数据元素要插入的位置,然后做如下两步工作:

将要插入位置元素以及后续的元素整体向后移动一个位置。将要插入的元素放到腾出来的位置上。
例如,我们要在顺序表 1 , 2 , 3 , 4 , 5 1,2,3,4,5 1,2,3,4,5 中 3 3 3 的位置插入6,需要一下几个步骤
首先找到要插入的目标位置

然后将目标位置以后的元素(包括目标位置的元素)整体向后移一个单位

最后就是从此目标位置插入要插入的元素

这里具体的代码不在给出,小伙伴如果想学习的话文章末尾留言即可。 顺序表的删除

顺序表中删除元素,这个实现起来的确没什么水平,非常简单,只需找到目标元素,并将其后续所有元素整体前移 1 个位置即可。后续元素整体前移一个位置,会直接将目标元素删除,可间接实现删除元素的目的。
例如,我们要在顺序表 1 , 2 , 6 , 3 , 4 , 5 1,2,6,3,4,5 1,2,6,3,4,5 中 删除6
首先遍历找到6

后面的元素整体向前移一个单位


这样,我们的删除操作就完成了,是不是很简单呀。

顺序表更改元素
顺序表的更改元素也很简单,直接找到要更改的元素,直接修改就行。
例如,我们要在顺序表 1 , 2 , 3 , 4 , 5 1,2,3,4,5 1,2,3,4,5 中将3修改为6
首先遍历找到3

然后就可以直接将其修改为6,无需其他操作

总结一下哈

这是数据结构系列文章的第二篇,主要介绍了线性表中的顺序表的相关操作,下一篇将主要介绍链表的相关知识。关于关于顺序表的相关代码本人已全部在linux上验证通过,各位小伙伴如果想要参考请在文章末尾留言。

欢迎关注本人公众号
D e c o d e 技 术 站 Decode技术站 Decode技术站

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。