【数据结构】顺序表详解

文章目录

前言

一、顺序表是什么

二、顺序表的基本操作

1.初始化

实现思想:

代码如下(示例):

2.顺序表扩容函数

实现思想:

代码如下(示例):

3.顺序表头插

实现思想:

代码如下(示例):

代码实现图(示例):

4.顺序表尾插

实现思想:

代码如下(示例):

代码实现图(示例):

5.顺序表尾删

实现思想:

代码如下(示例):

代码实现图(示例):

6.顺序表头删

实现思想:

代码如下(示例):

代码实现图(示例):

7.顺序表查找

实现思想:

代码如下(示例):

代码实现图(示例):

8.顺序表任意位置插入

实现思想:

代码如下(示例):

代码实现图(示例):

9.顺序表任意位置删除

实现思想:

代码如下(示例):

代码实现图(示例):

10.销毁顺序表

实现思想:

代码如下(示例):

11.顺序表打印

实现思想:

代码如下(示例):

代码实现图(示例):

12.顺序表修改

实现思想:

代码如下(示例):

代码实现图(示例):

总结


前言

本文详细的介绍了数据结构当中的最基础的顺序表,可以让初学者对顺序表进行深刻的的理解


一、顺序表是什么

顺序表是一种线性结构,它的逻辑上相邻的数据在计算机内的存储位置也是相邻的,可以快速定位第几个元素,中间不允许有空,所以插入、删除时需要移动大量元素。顺序表可以分配一段连续的存储空间。顺序表上的基本操作有:初始化、顺序表头插、尾插、头删、尾删、查找、插入、删除、修改、销毁顺序表。

二、顺序表的基本操作

1.初始化

一个程序要进行首先一个功能,首先要保证要进行初始化。对数据的初始化就如同汽车的车架子相同。

实现思想:

主体思想:为程序开辟所需要的内存空间,并对开辟的结构体进行初始化

顺序表的初始化,首先要保证头节点地址不为空,然后使用malloc函数开辟一个固定大小结构体的空间,使结构体的当中的指针至指向该空间,并且判断是否开辟失败,如果失败perror函数返回开辟失败的原因,并将结构体的其他的变量进行初始化

代码如下(示例):

void SLInit(SL* ps)
{assert(ps);ps->a = (SLDataType*)malloc(sizeof(SLDataType)*4);if (ps->a == NULL){perror("malloc failed");return;}ps->size = 0;ps->capacity = 4;
}

2.顺序表扩容函数

扩容函数主要是为满足增加功能在使用时的内存不足的情况,而该函数可以帮助函数进行空间的扩大

实现思想:

主体思想:先判断该结构体指向的地址不为空,然后进行数据存放数量和空间大小进行比较,如果有效存储空间满了就进行空间的增补,使用realloc函数进行在原来的空间的后面开辟空间,开辟失败就返回原因,并结束程序,开辟成功就在对指针进行重新的赋值有效空间同样进行跟改。

代码如下(示例):

void SLCheckCapacity(SL* ps)
{assert(ps);// 满了要扩容if (ps->size == ps->capacity){SLDataType* tmp = (SLDataType*)realloc(ps->a, ps->capacity * 2 * (sizeof(SLDataType)));if (tmp == NULL){perror("realloc failed");exit(-1);}ps->a = tmp;ps->capacity *= 2;}
}

3.顺序表头插

顺序表的头插的通俗理解:

就像在超市结账时一条长长的,尽然有序的买完东西人们正在排着队,突然来了一个人,以非常豪横的态度要第一个结账,大家看这个人不好惹,不想自找麻烦,就默认让这个人插了队,这个人插了队不要紧,因为他一个的插队造成第一个位置原本只能一个人的位置,现在两个人站着那里,就比较拥挤,这个时候,那个豪横的人就向后面的人说往后退一个位置,后面的人就和他后面的人说让个位置,就这样一个人的插入让整个队伍向后退了一个位置。

实现思想:

主体思想:判断结构体地址不为空。在判断空间是否足够,不够就扩容,然后利用数据的下标写一个循环进行数据向后移动,循环完的顺序表就可以利用下标在数组头部进行插入,再让有效数据的大小进行加一位

代码如下(示例):

void SLPushFront(SL* ps, SLDataType x)
{assert(ps);SLCheckCapacity(ps);// 挪动数据int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];--end;}ps->a[0] = x;ps->size++;
}

代码实现图(示例):

4.顺序表尾插

实现思想:

主体思想:就数值的末端添加一个数据

先判断传的地址是否为空,在进行扩容判断,在通过下标添加数据

代码如下(示例):

void SLPushBack(SL* ps, SLDataType x)
{assert(ps);SLCheckCapacity(ps);ps->a[ps->size] = x;ps->size++;}

代码实现图(示例):

5.顺序表尾删

实现思想:

主体思想:将最后一个数值释放控制权

确保传的地址和有效大小不为空,再对有效大小减少一位,这样就删除了尾数据。因为数据在空间当中的存储是比特,释放控制权就是让空间可以被其他人利用,我们不要了,不对其进行访问。

代码如下(示例):

void SLPopBack(SL* ps)
{assert(ps);assert(ps->size > 0);ps->size--;
}

代码实现图(示例):

6.顺序表头删

实现思想:

主体思想:让数据此前往后的进行打印复制

代码如下(示例):

void SLPopFront(SL* ps)
{assert(ps);assert(ps->size > 0);int begin = 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];++begin;}ps->size--;
}

代码实现图(示例):

7.顺序表查找

实现思想:

主体思想:通过下标指向的值进行判断来寻找

代码如下(示例):

int SLFind(SL* ps, SLDataType x)
{assert(ps);for (int i = 0; i < ps->size; i++){if (ps->a[i] == x){return i;}}return -1;
}

代码实现图(示例):

8.顺序表任意位置插入

实现思想:

主体思想:通过查找函数找到下标,将下标及后面的数据进行移动,再将新的数值通过下标插入进去。

代码如下(示例):

void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);int end = ps->size - 1;while (end >= pos){ps->a[end + 1] = ps->a[end];--end;}ps->a[pos] = x;ps->size++;
}

代码实现图(示例):

9.顺序表任意位置删除

实现思想:

主体思想:通过下标来找到那个位置的值,让后面的数值向前面进行覆盖。

代码如下(示例):

void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);int begin = pos + 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];++begin;}ps->size--;
}

代码实现图(示例):

10.销毁顺序表

实现思想:

主体思想:将指针指向的空间释放,然后在将该空间赋为空。

代码如下(示例):

void SLDestroy(SL* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->capacity = ps->size = 0;
}

11.顺序表打印

实现思想:

主体思想:和打印数组相同

代码如下(示例):

void SLPrint(SL* ps)
{assert(ps);for (int i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}printf("\n");
}

代码实现图(示例):

12.顺序表修改

实现思想:

主体思想:通过下标找到该元素,对该元素进行再次赋值

代码如下(示例):

void SLModify(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos < ps->size);ps->a[pos] = x;
}

代码实现图(示例):


总结

以上就是数据结构当中的顺序表的全部功能的实现,通过思想和代码实现,和效果图让初学者也可以快速上手。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/179185.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录一次 添加脚本的记录+改错记录

1.Update 和 Delete 一定要记得where条件 update 表名称 set 字段1‘修改的值’ &#xff08;单引号&#xff09; where 字段‘’ and Aid‘’; update jxkh22 set JXKH2200001 ,JXKH2201002 where B003 and JXKH22034;delete from table_name where condition delete from …

推荐系统笔记--基于物品的协同过滤(Item CF)

1--基本原理 Item CF的原理是根据物品的相似度来将新的物品推荐给用户&#xff1b;下图中用户对红色物品的感兴趣度为 [2, 1, 4, 3]&#xff0c;红色物品与橙色物品的相似度为 [0.1, 0.4, 0.2, 0.6]&#xff0c;因此可以计算出用户对橙色物品的感兴趣度。 Item CF的基本思想是&…

C语言--每日五道选择题--Day12

第一题 1、如下程序的功能是&#xff08; &#xff09; #include <stdio.h> int main() {char ch[80] "123abcdEFG*&";int j;puts(ch);for(j 0; ch[j] ! \0; j){if(ch[j] > A && ch[j] < Z){ch[j] ch[j] e - E;}}puts(ch);return 0; } A…

汽车操纵稳定性matlab仿真

1、内容简介 略 14-可以交流、咨询、答疑 2、内容说明 汽车操纵稳定性matlab仿真&#xff0c;包含完整的论文 操纵动力学、两自由度 摘要&#xff1a;当今&#xff0c;仿真技术日益广泛地应用于汽车工程领域&#xff0c;操纵稳定性研究越来越多地使用成熟的计算机仿真理论…

肝了一周,整理了Python 从0到1学习路线(附思维导图和PDF下载)

前段时间&#xff0c;我们陆续分享了一些关于Python基础知识&#xff0c;以及现在比较流行的Python各领域的学习知识&#xff0c;后台有很多小伙伴反馈&#xff0c;想要系统的自学Python&#xff0c;希望我们可以提供一个框架&#xff0c;方便作为参考&#xff0c;学习Python。…

unity使用vs进行c#代码提示,查看F12unity元代码

unity关联vs 在vs中让cs.meta显示&#xff0c;鼠标右键&#xff0c;包含在内 提示GameObject类了 感谢下面这位的提示https://zhuanlan.zhihu.com/p/551119106

【Python+selenium】自动化生成测试报告

批量执行完用例后&#xff0c;生成的测试报告是文本形式的&#xff0c;不够直观&#xff0c;为了更好的展示测试报告&#xff0c;最好是生成HTML格式的。 unittest里面是不能生成html格式报告的&#xff0c;需要导入一个第三方的模块&#xff1a;HTMLTestRunner 一、入HTMLTe…

记录一次hibernate3.1 方言问题

错误&#xff1a;com.sun.proxy.$Proxy553 cannot be cast to java.lang.string 我们项目上&#xff0c;将mysql数据库迁移到达梦数据库&#xff0c;这样会造成数据库类型上在java查询下&#xff0c;会有不兼容的问题&#xff0c;比如clob&#xff0c;text等&#xff0c;…

机器学习的线性回归与非线性回归

一元线性回归 回归分析用来建立方程模拟两个或者多个变量之间如何关联 一元线性回归包括一个自变量和一个因变量 如果包含两个以上的自变量&#xff0c;则称为多元线性回归 代价函数&#xff08;损失函数&#xff09; 损失函数的最终目的是为了使得误差平方和最小 用梯度下…

SDL2 播放音频(MP4)

1.简介 这里引入FFmpeg库&#xff0c;获取音频流数据&#xff0c;然后通过FFmpeg将视频流解码成pcm原始数据&#xff0c;再将pcm数据送入到SDL库中实现音频播放。 2.FFmpeg的操作流程 注册API&#xff1a;av_register_all()构建输入AVFormatContext上下文&#xff1a;avform…

01背包 D. Make Them Equal

Problem - D - Codeforces 输出值不超过k次操作后的最大值。 看b数组的大小&#xff0c;b数组元素是小于1000的正整数。从1到bi如果可以&#xff0c;那么最多是大概10次的&#xff0c;因为是指数递增的&#xff0c;例如&#xff1a;1 -> 2 -> 4 -> 8 -> 16 -> …

PostGIS学习教程七:关于几何图形的练习

文章目录 一、函数列表二、练习 一、函数列表 以下是我们迄今为止看到的所有函数的汇总&#xff0c;它们应该对练习有用&#xff01; sum(expression) aggregate to return a sum for a set of records count(expression) aggregate to return the size of a set of records …