【数据结构】:顺序表专题

前言:今天我们开始介绍数据结构有关内容,那么数据结构是什么呢?

数据结构是计算机存储、组织数据的方式在工作中,我们通常会直接使用已经封装好的集合API(应用程序编程接口),这样可以更高效地完成任务。但是作为一名程序员,掌握数据结构是非常重要的,因为它可以帮助我们更好地理解和设计算法,从而提高程序的效率和可靠性。

一.🐶常见数据结构分类: 

二.顺序表概述: 

(一):何为顺序表?

本篇将介绍线性数据结构中的顺序表专题(Sequence List),其本质就是数组。 

一句话总结顺序表:顺序表就是经过封装后提供了许多现成方法的一种数据结构,其底层是数组。

那已经有了数组,为什么还需要顺序表呢?

当我们需要对数组中的某些数据进行处理(包括增删查改等),此时我们需要找到数组中有元素个数,再通过循环或其他方式插入,删除数据。这样以来就十分麻烦,而顺序表就方便解决了这些问题。

此外,顺序表是线性表的一种。

顺序表的特性:物理结构是连续的,逻辑结构一定是连续的 。

(物理结构:数据在内存上是连续存储的,是硬件层面上的;逻辑结构:数据按某种逻辑排序,有迹可循,是抽象意义上的)

(二)顺序表的分类:

试想我们如何写一个顺序表,我们知道顺序表本质是数组,那么对于数组我们有定长数组和动态内存开辟数组:

int arr[10]={0}:定长的数组

int* arr:动态内存开辟的数组,确定大小之后再去动态申请

那么对于顺序表也应该分为两种情况,分为静态顺序表动态顺序表: 

//静态顺序表定义:
struct Seqlist
{int arr[100];//定长的数组int size;//顺序表当前有效的数据个数
};//动态顺序表:
struct SeqList
{int* arr;int size;//有效数据个数int capacity;//空间大小
};

那么哪一种方式更好呢?不难理解当然是动态顺序表更胜一筹,对于 静态顺序表,其中的数组是定长的,数组大小给小了,空间不够用;数组给大了,空间又浪费了。极不方便,而动态顺序表由于可以动态增容,因而我们选择这种实现方式。

三.顺序表的实现

接下来我们将就如何实现一个顺序表具体讲解,作为一个项目而言,代码量是庞大的,所以我们要创建多个文件,方便我们流畅地实现一个结构清晰的代码,我们需要创建三个文件:

test.c:主文件,也是测试文件;

Seqlist.c:顺序表主体,具体功能实现;

Seqlist.h:顺序表头文件,声明顺序表的结构,方法等。

 

1.Seqlist.h 

 

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>//我们选择动态顺序表//存储的数据我们不能仅仅是int,还需要其他类型
typedef int SLDataType;
//当对应数据类型改变时,我们只需改变int,换成所需数据类型即可
//typedef struct Seqlist SL;typedef struct Seqlist
{SLDataType* arr;int size;//有效数据个数int capacity;//空间大小
}SL;//顺序表的初始化
void SLInit(SL* ps);//容量检查
void SLCheckCapacity(SL* ps);//头部插入删除/尾部插入删除
//尾插/头插
void SLPushBack(SL* ps, SLDataType x);
void SLPushFront(SL* ps, SLDataType x);//尾删/头删
void SLPopBack(SL* ps);
void SLPopFront(SL* ps);//顺序表的销毁
void SLDestroy(SL* ps);//打印调试
void SLPrint(SL s);

Seqlist.h中包含着顺序表的结构以及顺序表中需要实现的函数的声明。

在实现顺序表的声明中我们的思路如下:1.选择合适的顺序表结构——动态顺序表;2.使用typedef拓展数据变量以及简化顺序表名称;3.依次声明实现不同功能的各部分函数。

2.Seqlist.c 

#include"Seqlist.h"
void SLInit(SL* ps)
{ps->arr = NULL;ps->size = ps->capacity = 0;
}void SLCheckCapacity(SL* ps)
{//插入之前先看空间够不够if (ps->capacity == ps->size){//申请空间//malloc calloc realloc  int arr[100] --->增容:realloc//第一个问题:要申请多大的空间/一次增容多大? 答案:一般两倍增容int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(int));if (tmp == NULL){perror("realloc fail!");exit(1);//直接退出,程序不再继续执行}//空间申请成功ps->arr = tmp;ps->capacity = newcapacity;}
}void SLPushBack(SL* ps, SLDataType x)
{assert(ps);SLCheckCapacity(ps);/*ps->arr[ps->size] = x;++ps->size;*/ps->arr[ps->size++] = x;
}void SLPushFront(SL* ps, SLDataType x)
{assert(ps);SLCheckCapacity(ps);for (int i = ps->size;i > 0;i--){ps->arr[i] = ps->arr[i - 1];//arr[1]=arr[0]}ps->arr[0] = x;ps->size++;
}void SLPopBack(SL* ps)
{assert(ps);assert(ps->size);--ps->size;
}void SLPopFront(SL* ps)
{assert(ps);assert(ps->size);for (int i = 0;i <ps->size-1 ;i++){ps->arr[i] = ps->arr[i + 1];//arr[size-2]=arr[size-1]}--ps->size;
}void SLDestroy(SL* ps)
{if (ps->arr){free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}void SLPrint(SL s)
{for (int i = 0;i <s.size;i++){printf("%d ", s.arr[i]);}printf("\n");
}

Seqlist.c 中主要是具体实现Seqlist.h中声明的各函数,顺序最好按声明的顺序来,方便查找。

切记还要包含头文件"Seqlist,h”。

3.test.c

 

#include"Seqlist.h"void SLTest01()
{SL sl;//SLInit(sl);//形参是实参的一份临时拷贝,都没有初始化,拷贝不过去SLInit(&sl);//传址//增删查找//尾插SLPushBack(&sl, 1);SLPushBack(&sl, 2);SLPrint(sl);//头插SLPushBack(&sl, 3);SLPushBack(&sl, 4);SLPrint(sl);SLPushFront(&sl, 5);SLPushFront(&sl, 6);SLPrint(sl);//头删SLPopFront(&sl);SLPopFront(&sl);SLPrint(sl);//尾删SLPopBack(&sl);SLPopBack(&sl);SLPrint(sl);SLDestroy(&sl);//销毁
}int main()
{SLTest01();return 0;
}

test.c中主要是测试功能,检查顺序表是否能正常使用。

输出结果如下:

如图我们所实现的顺序表按照预期实现了对数据的增删查改。 

以上就是对数据结构中顺序表的概述以及基本实现方式,看一万遍不如手写一遍,其中有许多易错点和细节需要注意,大家最好是理解了后自己手写一遍,加深记忆,望屏幕前的你能有所收获!

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

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

相关文章

R+VIC模型融合实践技术应用及未来气候变化模型预测

在气候变化问题日益严重的今天&#xff0c;水文模型在防洪规划&#xff0c;未来预测等方面发挥着不可替代的重要作用。目前&#xff0c;无论是工程实践或是科学研究中都存在很多著名的水文模型如SWAT/HSPF/HEC-HMS等。虽然&#xff0c;这些软件有各自的优点&#xff1b;但是&am…

【QT入门】 Qt自定义控件与样式设计之QPushButton实现鼠标悬浮按钮弹出对话框

往期回顾&#xff1a; 【QT入门】 Qt自定义控件与样式设计之qss选择器-CSDN博客 【QT入门】 Qt自定义控件与样式设计之QLineEdit的qss使用-CSDN博客 【QT入门】Qt自定义控件与样式设计之QPushButton常用qss-CSDN博客 【QT入门】 Qt自定义控件与样式设计之QPushButton实现鼠标悬…

【三十九】【算法分析与设计】综合练习(5),79. 单词搜索,1219. 黄金矿工,980. 不同路径 III

79. 单词搜索 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平…

编程羔手-讲解下YUDAO的Flowable工作流和表格的关系

我这里简单讲解&#xff0c;最好的学习内容就是官方文档(可慢看和作为FYI供你参考) 一般顺序&#xff1a;定义流程模型->流程发布->运行实例&#xff0c;各种查就是历史数据。 数据库表名说明 Flowable的所有数据库表都以ACT_开头。第二部分是说明表用途的两字符标示符…

vue canvas绘制信令图,动态显示标题、宽度、高度

需求: 1、 根据后端返回的数据&#xff0c;动态绘制出信令图 2、根据 dataStatus 返回值&#xff1a; 0 和 1&#xff0c; 判断 文字内容的颜色&#xff0c;0&#xff1a;#000&#xff0c;1&#xff1a;red 3.、根据 lineType 返回值&#xff1a; 0 和 1&#xff0c; 判断 箭…

FPGA:图像数字细节增强算法(工程+仿真+实物,可用毕设)

目录 日常唠嗑一、视频效果二、硬件及功能1、硬件选择2、功能3、特点 未完、待续……四、工程设计五、板级验证六、工程获取 日常唠嗑 有2个多月没写文章了&#xff0c;又是老借口&#xff1a;“最近实在是很忙”&#x1f923;&#xff0c;不过说真&#xff0c;确实是比较忙&am…

vue点击上传图片并实现图片预览功能,并实现多张图片放到一个数组中进行后端请求(使用原生input)

一、将 File 对象转成 BASE64 字符串 &#xff08;FileReader&#xff09; <template><div><!-- 用来显示封面的图片 --><!-- <img src"/assets/images/cover.jpg" alt"" class"cover-img" ref"imgRef" />…

最短编辑距离(线性dp)-java

最短编辑问题也是一种非常经典的二维线性dp问题。 文章目录 前言 一、最短编辑距离问题 二、算法思路 1.dp[i][j]的情况 2.边界问题初始化 3.状态转移方程 三、代码如下 1.代码如下 2.读入数据 3.代码运行结果 总结 前言 最短编辑问题也是一种非常经典的二维线性dp问题。 提示&…

C++学习进阶:unordered_set和ma的实现

目录 前言 1.哈希表的结构 1.1.哈希节点 1.2.迭代器的结构 1.2.1.普通迭代器 1.2.2.const迭代器的实现 1.3.哈希表的实现 2.如何封装哈希表实现个性化的容器 2.1.unordered_set的封装 2.2.unordered_map的封装 3.以上内容的代码实现 3.1.HashTable.h 3.2.unorde…

51单片机之LED点阵屏

目录 1.LED点阵屏简介 2.配置LED点阵屏代码 1.LED点阵屏简介 LED点阵屏真的是遍布我们我们生活的每个角落&#xff0c;从街边的流动显示字的招牌到你的液晶显示屏&#xff0c;都是基于点阵屏的原理研究出来的。还有那个世界上最大的球状建筑物&#xff1a;MSG Sphere&#xff…

低代码ARM计算机在IIoT中的采集控制生产面板

工业4.0的大潮下工业物联网&#xff08;IIoT&#xff09;已成为推动制造业转型升级的重要动力。其中&#xff0c;低代码ARM嵌入式计算机凭借其出色的性能、灵活的配置以及高度集成化的特点&#xff0c;在工业设备远程监控、维护与诊断方面发挥着关键作用。 一、远程监控与维护 …

python爬虫———post请求方式(第十四天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

Maven与Jave web结构

Maven 简介 https://www.liaoxuefeng.com/wiki/1252599548343744/1255945359327200 java web module web目录 –src 应用程序源代码和测试程序代码的根目录 –main –java  应用程序源代码目录     --package1     --class1     --class2 –resources  应用…

Docker内更新Jenkins详细讲解

很多小伙伴在Docker中使用Jenkins时更新遇到困难&#xff0c;本次结合自己的实际经验&#xff0c;详细讲解。根据官网Jenkins了解以下内容&#xff1a; 一、Jenkins 是什么? Jenkins是一款开源 CI&CD 软件&#xff0c;用于自动化各种任务&#xff0c;包括构建、测…

Mysql-数据库集群的搭建以及数据库的维护

一、数据库的维护 1.数据库的备份与恢复 1&#xff09;备份指定数据库 #mysqldump -u root -p zx > ./zx.dump 2&#xff09;备份所有库 #mysqldump -u root -p --all-databases > ./all.dump 3)恢复所有库 #mysql -u root -p < ./all.dump 4)恢复指定数据库 #mysq…

网络基础三——IP协议补充和Mac帧协议

全球网络及网段划分的理解 ​ 根据国家组织地区人口综合评估进行IP地址范围的划分&#xff1b; ​ 假设前8位用来区分不同的国家&#xff0c;国际路由器负责全球数据传输&#xff0c;子网掩码为IP/8&#xff1b;次6位区分不同的省份&#xff0c;国内路由器负责全国数据的传输…

再见 MybatisPlus,阿里推出新 ORM 框架更牛X

最近看到一个 ORM 框架 Fluent Mybatis 挺有意思的&#xff0c;整个设计理念非常符合工程师思维。 我对官方文档的部分内容进行了简单整理&#xff0c;通过这篇文章带你看看这个新晋 ORM 框架。 官方文档&#xff1a;https://gitee.com/fluent-mybatis/fluent-mybatis/wikis 提…

Golang | Leetcode Golang题解之第19题删除链表的倒数第N个结点

题目&#xff1a; 题解&#xff1a; func removeNthFromEnd(head *ListNode, n int) *ListNode {dummy : &ListNode{0, head}first, second : head, dummyfor i : 0; i < n; i {first first.Next}for ; first ! nil; first first.Next {second second.Next}second.N…

Redis缓存设计

文章目录 1 缓存的收益与成本分析1.1 收益1.2 成本 2 缓存更新策略的选择和使用场景2.1 LRU/LFU/FIFO算法剔除2.2 超时剔除2.3 主动更新2.4 缓存更新策略对比 2.5 最佳实践 3 缓存粒度控制方法3.1 缓存全部数据3.2 缓存部分数据3.3 缓存粒度控制方法对比 4 缓存穿透问题优化4.1…

(2022级)成都工业学院软件构造实验三:面向数据的软件构造

写在前面 1、基于2022级软件工程实验指导书 2、代码仅提供参考 3、如果代码不满足你的要求&#xff0c;请寻求其他的途径 运行环境 window11家庭版 IntelliJ IDEA 2023.2.2 jdk17.0.6 实验要求 任务&#xff1a; ‍一、构造任务4&#xff1a;批量产生习题并用文件存储…