【数据结构】动态顺序表的接口实现(附图解和源码)
动态顺序表的接口实现(附图解和源码)
文章目录
- 动态顺序表的接口实现(附图解和源码)
- 前言
- 一、定义结构体
- 二、每一个接口的实现原理(附图解)
- 1.初始化顺序表
- 2.增容顺序表
- 3.尾插数据
- 4.删除顺序表信息(尾删)
- 5.打印顺序表信息
- 6.销毁顺序表
- 7.头插数据
- 8.删除顺序表信息(头删)
- 9.查找顺序表中元素
- 10.指定pos下标位置插入元素
- 11.删除pos位置的数据(头删+尾删+任意位置删除)
- 三、源代码整理
- 总结
前言
本文主要介绍动态顺序表中增删查改等接口实现,结尾附总源码!
一、定义结构体
代码如下(示例):
#define N 1000
typedef int SLDataType;//int->SLDataTypetypedef struct SeqList
{SLDataType* a;int size; //表示数组中存储了多少个元素int capacity; //表示最大容积
}SeqList;
二、每一个接口的实现原理(附图解)
注意:接口函数的命名风格是跟着STL走的。
这里的11个接口,我都会一 一为大家讲解(图解+源码)
1.初始化顺序表
初始化的时候把a数组为NULL,储存元素个数和最大容量都设为0
代码如下(示例):
void SeqListInit(SeqList* ps)
{ps->a = NULL;ps->size = 0;ps->capacity = 0;
}
2.增容顺序表
当我们的size和capacity相等的时候(数组已经满了),要进行增容!具体看下图!
代码如下(示例):
void SeqLisrCheckCapacity(SeqList* ps)
{if (ps->size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));if (tmp == NULL){printf("realloc fail\n");exit(-1);}ps->a = tmp;ps->capacity = newcapacity;}
}
3.尾插数据
代码如下(示例):
void SeqListPushBack(SeqList* ps, SLDataType x)
{SeqLisrCheckCapacity(ps);ps->a[ps->size] = x;ps->size++;
}
4.删除顺序表信息(尾删)
大家可能会好奇,为什么这里只有尾删法,一会我会给大家介绍指定位置删除的方法~
代码如下(示例):
void SeqListPopBack(SeqList* ps)
{if (ps->size > 0){//ps->a[ps->size - 1] = 0;ps->size--;}elseprintf("容量不足,无法执行过多的删除行为!");
}
5.打印顺序表信息
打印信息和打印一个一维数组的打印方法一样,这里不做过多的介绍!
代码如下(示例):
void SeqListPrint(SeqList* ps)
{for (int i = 0; i < ps->size; ++i){printf("%d ", ps->a[i]);}printf("\n");
}
6.销毁顺序表
所谓销毁指的就是对realloc开辟的空间通过free进行释放!
代码如下(示例):
void SeqListDestroy(SeqList* ps)
{free(ps->a);ps->a = NULL;ps->size = ps->capacity = 0;
}
7.头插数据
头插和尾插得原来差不多,尾插一定要保证end>=0,这样才不会导致越界访问~
代码如下(示例):
void SeqListPushFront(SeqList* ps, SLDataType x)
{SeqLisrCheckCapacity(ps);int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}ps->a[0] = x;ps->size++;
}
8.删除顺序表信息(头删)
代码如下(示例):
void SeqListPopFront(SeqList* ps)
{int left = 0;if (ps->size > 0){while (left != ps->size - 1){ps->a[left] = ps->a[left + 1];left++;}ps->size--;}else{printf("没有可删除的内容!");}
}
9.查找顺序表中元素
这里采用一维数组的遍历方式进行查找并返回下标~
代码如下(示例):
int SeqListFind(SeqList* ps, SLDataType x)
{for (int i = 0; i < ps->size; i++){if (ps->a[i] == x)return i;}return -1;
}
10.指定pos下标位置插入元素
这里有两个注意的点:1.要保证pos下标不越界。2.要考虑增容问题
代码如下(示例):
void SeqListInsert(SeqList* ps, int pos, SLDataType x)
{assert(pos <= ps->size && pos >= 0);SeqLisrCheckCapacity(ps);int end = ps->size - 1;while (end >= pos){ps->a[end + 1] = ps->a[end];end--;}ps->a[pos] = x;ps->size++;
}
11.删除pos位置的数据(头删+尾删+任意位置删除)
这里的任意位置删除可以把头删和尾删替换掉,这种删除是很全面的~
注意:这里的pos不可以越界(不可以等于size)
代码如下(示例):
void SeqListErase(SeqList* ps, int pos)
{assert(pos < ps->size&& pos >= 0);int begin = pos + 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}
三、源代码整理
这里分为三个文件,分别是test.c(头文件包含和测试)、SepList.c(函数的实现)、SepList.h(头文件声明)
test.c 源码如下:
#include "SepList.h"
void TestSeqList1()
{SeqList s1;SeqListInit(&s1);SeqListPushBack(&s1, 1);SeqListPushBack(&s1, 2);SeqListPushBack(&s1, 3);SeqListPushBack(&s1, 4);SeqListPushBack(&s1, 5);SeqListPrint(&s1);SeqListPopBack(&s1);SeqListPopBack(&s1);SeqListPopBack(&s1);SeqListPopBack(&s1);SeqListPopBack(&s1);SeqListPrint(&s1);SeqListDestroy(&s1);
}
void TestSeqList2()
{SeqList s1;SeqListInit(&s1);SeqListPushBack(&s1, 1);SeqListPushBack(&s1, 2);SeqListPushBack(&s1, 3);SeqListPushBack(&s1, 4);SeqListPushBack(&s1, 5);SeqListPrint(&s1);SeqListPushFront(&s1, 30);SeqListPushFront(&s1, 40);SeqListPushFront(&s1, 50);SeqListPushFront(&s1, 60);SeqListPrint(&s1);int ret = SeqListFind(&s1, 30);//if (ret >= 0)// printf("找到了下标是%d\n", ret);//else// printf("%d\n", ret);SeqListInsert(&s1, 3, 35);SeqListPrint(&s1);SeqListErase(&s1, 0);SeqListPrint(&s1);
}
int main()
{//TestSeqList1();TestSeqList2();return 0;
}
SepList.h 源码如下:
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>#define N 1000
typedef int SLDataType;//int->SLDataTypetypedef struct SeqList
{SLDataType* a;int size; //表示数组中存储了多少个元素int capacity; //表示最大容积
}SeqList;//接口函数 -- 命名风格是跟着STL走的。
void SeqListInit(SeqList* ps);//初始化顺序表
void SeqListPushBack(SeqList* ps, SLDataType x);//添加顺序表信息
void SeqListDestroy(SeqList* ps);//销毁顺序表
void SeqLisrCheckCapacity(SeqList* ps);//增容顺序表
void SeqListPrint(SeqList* ps);//打印顺序表信息
void SeqListPopBack(SeqList* ps);//删除顺序表信息
void SeqListPushFront(SeqList* ps, SLDataType x);//头插数据
void SeqListPopFront(SeqList* ps);//删除头插信息
int SeqListFind(SeqList* ps, SLDataType x);//找到了返回x位置下标,没有找到返回-1
void SeqListInsert(SeqList* ps, int pos, SLDataType x);//指定pos下标位置插入
void SeqListErase(SeqList* ps, int pos);//删除pos位置的数据
SepList.c 如下(示例):
#include "SepList.h"void SeqListInit(SeqList* ps)
{ps->a = NULL;ps->size = ps->capacity = 0;
}void SeqListDestroy(SeqList* ps)
{free(ps->a);ps->a = NULL;ps->size = ps->capacity = 0;
}void SeqListPrint(SeqList* ps)
{for (int i = 0; i < ps->size; ++i){printf("%d ", ps->a[i]);}printf("\n");
}void SeqListPopBack(SeqList* ps)
{if (ps->size > 0){//ps->a[ps->size - 1] = 0;ps->size--;}elseprintf("容量不足,无法执行过多的删除行为!");
}void SeqLisrCheckCapacity(SeqList* ps)
{if (ps->size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));if (tmp == NULL){printf("realloc fail\n");exit(-1);}ps->a = tmp;ps->capacity = newcapacity;}
}void SeqListPushBack(SeqList* ps, SLDataType x)
{SeqLisrCheckCapacity(ps);ps->a[ps->size] = x;ps->size++;
}void SeqListPushFront(SeqList* ps, SLDataType x)
{SeqLisrCheckCapacity(ps);int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}ps->a[0] = x;ps->size++;
}void SeqListPopFront(SeqList* ps)
{int left = 0;if (ps->size > 0){while (left != ps->size - 1){ps->a[left] = ps->a[left + 1];left++;}ps->size--;}else{printf("没有可删除的内容!");}
}int SeqListFind(SeqList* ps, SLDataType x)
{for (int i = 0; i < ps->size; i++){if (ps->a[i] == x)return i;}return -1;
}void SeqListInsert(SeqList* ps, int pos, SLDataType x)
{assert(pos <= ps->size && pos >= 0);SeqLisrCheckCapacity(ps);int end = ps->size - 1;while (end >= pos){ps->a[end + 1] = ps->a[end];end--;}ps->a[pos] = x;ps->size++;
}void SeqListErase(SeqList* ps, int pos)
{assert(pos < ps->size&& pos >= 0);int begin = pos + 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}
总结
以上就是今天要讲的内容,本文介绍了动态顺序表的11种接口实现原理和源码图解!
如果我的博客对你有所帮助记得三连支持一下,感谢大家的支持!
在这里和大家声明一下,本人并不是大学生,而是一个编程爱好者!!!
相关文章:
【数据结构】动态顺序表的接口实现(附图解和源码)
动态顺序表的接口实现(附图解和源码) 文章目录动态顺序表的接口实现(附图解和源码)前言一、定义结构体二、每一个接口的实现原理(附图解)1.初始化顺序表2.增容顺序表3.尾插数据4.删除顺序表信息(…...
L2-003 月饼
月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。 注意:销售时允许取出一部分库存。样例给出的情形是这样的&#…...
volatile不等于原子操作
volatile作用 确保数据每次都从源头读取,即每次都从内存中读取,不从缓存中读取。 这样做的目的是确保不会被优化 int i 0;int main(int argc, char **argv) {const char *str;if (i 0) {str "hello";} else {str "world";}ret…...
每天10个前端小知识 【Day 15】
👩 个人主页:不爱吃糖的程序媛 🙋♂️ 作者简介:前端领域新星创作者、CSDN内容合伙人,专注于前端各领域技术,成长的路上共同学习共同进步,一起加油呀! ✨系列专栏:前端…...
异构数据库同步方案
目录 1 概述 2 原理 3 参数 1 概述 将企业生产系统产生的业务数据实时同步到大数据平台,通过对业务数据的联机实时分析,快速制定或调整商业计划,提升企业的核心竞争力。 依据同步数据是否需要加工处理,采用不同的技术方案&am…...
MySQL-系统信息函数
获取 MySQL 版本号的函数VERSION()例:返回当前mysql版本信息mysql> select version(); ----------- | version() | ----------- | 5.7.40 | ----------- 1 row in set (0.01 sec)查看当前用户的连接数的ID函数CONNECTION_ID()例1:查看当前用户连接…...
Windows环境下使用Pycharm运行sh文件
博主在调试一些程序时,时常遇到 .sh文件,这是Linux中的shell脚本文件,那么这种文件在windows下如何运行呢,其实我们可以通过git来实现,接下来看我操作。 首先我们需要安装Git,关于其安装过程可以参考博主这…...
Flutter启动流程浅析
一,Mixins1,定义:Mixins 是一种在多个类层次结构中重用类代码的方法。个人理解:就是一个类,这个类有一些方法,其他类可以在不继承这个类的情况下使用这个类的方法。2,几个关键词(1&a…...
004:NumPy的应⽤-2
数组的运算 使⽤NumPy 最为⽅便的是当需要对数组元素进⾏运算时,不⽤编写循环代码遍历每个元素,所有的运算都会⾃动的⽮量化(使⽤⾼效的、提前编译的底层代码来对数据序列进⾏数学操作)。简单的说就是,NumPy 中的数学运…...
一文了解JAVA中同步、异步、阻塞和非阻塞
🏆今日学习目标: 🍀JAVA中同步、异步、阻塞和非阻塞 ✅创作者:林在闪闪发光 ⏰预计时间:30分钟 🎉个人主页:林在闪闪发光的个人主页 🍁林在闪闪发光的个人社区,欢迎你的加…...
查询股票交易日接口可以用C++实现查询当日成交吗?
用查询股票交易日接口可以自行查询各大交易网站或交易所的股票历史数据及行情数据,也可以用它 查询当日成交数据! 接下来小编就来分享一下用C实现查询当日成交代码: std::cout << " 查询当日成交: category 3 \n"; categ…...
java中常见的json库以及对应的用法
一、常见的json库 1、Jackson: Jackson是一个高性能、灵活性强的JSON库,提供了丰富的API,支持JSON和XML的数据解析和生成。它支持对Java对象进行序列化和反序列化,可以处理复杂的JSON格式数据。 导入的依赖 https://mvnrepository.com/ &…...
德赛西威NAV75*-SV731*导航升级(凯立德J30)实战
一、前言:升级导航德赛西威(2015年买的)地图几年没升级过了(之前自己折腾了一个)之前的启动是DSA2013(电子G已经无法升级数据文件了,本次只升级地图J30图资-凯立德)主程序版本&#…...
[USACO2023-JAN-Bronze] T1 LEADERS 题解
一、题目描述Farmer John 有 N 头牛 (2≤N≤10^5)。 每头牛有对应的品种:Guernsey or Holstein. 按照惯例,这些牛站成一排,编号从1到N。在某一天,每头牛写了一个数字, 第i头牛写的数字Ei明确地表示了一个范围,表示范围…...
第二章:unity性能优化之drawcall优化-1
目录 前言: 一、什么是drawcall 二、如何合批 1、什么是合批? 2、静态批处理 1、什么是静态批处理: 2、静态合批的规则 3、动态批处理 4、GPU Instancing 1、GPU instancing的定义 2、编写支持GPU instancing Shader步骤 5、…...
【2341. 数组能形成多少数对】
来源:力扣(LeetCode) 描述: 给你一个下标从 0 开始的整数数组 nums 。在一步操作中,你可以执行以下步骤: 从 nums 选出 两个 相等的 整数从 nums 中移除这两个整数,形成一个 数对 请你在 nu…...
[TPAMI‘21] Heatmap Regression via Randomized Rounding
paper: https://arxiv.org/pdf/2009.00225.pdf code: https://github.com/baoshengyu/H3R 总结:本文提出一套编解码方法: 编码:random-round整数化 激活点响应值表征小数部分,使得GT可以通过编码后的heatmap解码得到;…...
pytorch下tensorboard使用[远程服务器]
** 1、安装tensorboard ** pip install tensorboard可以不安装tensorflow,后续会有提示: TensorFlow installation not found - running with reduced feature set. 但是没有影响。 2、创建环境,导出数据 这一步由代码中的writer完成。 …...
CentOS下安装Nginx的详细步骤
1.安装依赖:yum -y install gcc gcc-c make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel 2.下载Nginx安装包:wget -c https://nginx.org/download/nginx-1.18.0.tar.gz 3.解压,进入解压目录: tar -zxvf nginx-1.18.0.…...
CSS编码规范
本篇文章是基于王叨叨大佬师父维护的文档梳理的,有兴趣可以去看一下原文CSS编码规范。 其实不管是HTML也好,还是CSS也好,有些规范其实是共通的。 1. 命名 class的命名应该偏向语义化,不是为了样式而去命名,而是通过…...
Linux下makefile 编译项目
文章目录1、规划makefile编写2、makefile文件2.1、根目录下common.mk2.2、config.mk2.3、根目录makefile2.4、其他目录下1、规划makefile编写 a、根目录下放三个文件: 1、makefile:是咱们编译项目的入口脚本,编译项目从这里开始,…...
Linux磁盘查看,使用(分区、格式化、挂载)
目录 0、观察磁盘分区状态:lsblk、blkid、parted 0.1 lsblk列出系统上的所有磁盘列表 0.2 blkid列出设备的UUID等参数 0.3 parted列出磁盘的分区表类型与分区信息 1、磁盘分区:gdisk、fdisk 1.1 fdisk 2、磁盘格式化(创建文件系统…...
走进WebGL
什么是 WebGL? WebGL 是一种跨平台、免版税的 API,用于在 Web 浏览器中创建 3D 图形。基于 OpenGL ES 2.0,WebGL 使用 OpenGL 着色语言 GLSL,并提供熟悉的标准 OpenGL API。因为它在 HTML5 Canvas 元素中运行,所以 We…...
Unity 中 Awake 和 Start 时机与 GameObject的关系
Awake和Start很相似,都是在脚本的初始阶段执行 但是有两点重要不同: Awake先执行Awake即便在脚本 disabled (即enabled false)时,也会执行,但是Start就不会执行了 对一个物体: 当初始没有激…...
1月份 GameFi 行业报告
Jan. 2023, DanielData Source: January Monthly GameFi Report在经历了艰难的一年之后,1 月是对加密货币市场最有利的月份。虽然可以说的大部分内容适用于其他看涨周期,但有几个统计数据令 1 月在区块链领域非常有趣。例如&#…...
JVM - 调优
目录 调什么,如何调 内存方面 线程方面 如何调优 调优的目标,策略和冷思考 JVM调优的目标 常见调优策略 JVM调优冷思考 调优经验与内存泄漏分析 JVM调优经验 内存泄露 调什么,如何调 内存方面 JVM需要的内存总大小各块内存分配,新生代、老年代、存活区选…...
flask配置https协议
感谢https://blog.csdn.net/qq_33934427/article/details/127456673,文中多有参考再实践一、要用https协议需要有ca证书,在windows10先下载windows版本openssl,地址如下https://share.weiyun.com/vfjVrMAb我是64位的选择下载完毕安装后配置环…...
Springboot 我随手封装了一个万能的导出excel工具,传什么都能导出
前言 如题,这个小玩意,就是不限制你查的是哪张表,用的是什么类。 我直接一把梭,嘎嘎给你一顿导出。 我知道,这是很多人都想过的, 至少我就收到很多人问过我这个类似的问题。 我也跟他们说了,但…...
【Linux详解】——进程控制(创建、终止、等待、替换)
📖 前言:本期介绍进程控制(创建、终止、等待、替换)。 目录🕒 1. 进程创建🕘 1.1 fork函数初识🕘 1.2 fork的返回值问题🕘 1.3 写时拷贝🕘 1.4 创建多个进程🕒…...
HummerRisk V0.9.1:操作审计增加百度云,增加主机检测规则及多处优化
HummerRisk V0.9.0发布:增加RBAC 资源拓扑图,首页新增检查的统计数据,云检测、漏洞、主机等模块增加规则,对象存储增加京东云,操作审计增加金山云,镜像仓库新增设置别名。 感谢社区中小伙伴们的反馈&#…...
wordpress中国/汕头网站关键词推广
1.注释注释是为了解释某些代码所加的文字,类似批注,提高程序可读性。编译时,编译器直接跳过,不会 变成字节码文件。单行注释:以"//"开头,这一行"//"后面均为注释,换行即结束…...
池州网站建设电话/宁波seo深度优化平台有哪些
安装一些软件 python redis mysql jdk,都需要添加环境变量,一个路径添加到了环境变量,就可以直接在linux控制台输入 xx命令。 否则不添加环境变量,使用xx就会提示找不到命令,需要跳转到那个目录。然后执行 ./xx&#…...
做网站电话/百度关键词排名突然没了
之前我一直用Seconds_behind_master来衡量主从的延迟,今天看到文档,才觉得多么不可靠!以下是官方文档的描述: In essence, this field measures the time difference in seconds between the slave SQL thread and the slave I/O …...
网页游戏排行榜前十推荐/seo怎么做关键词排名
kafka采坑记录: 1、kafka服务端server.properties中的broker.id集群内需要唯一。 2、kafka config文件中listeners和advertised.listeners需要配置本机ip:9092地址,不然消费不到数据。(如:192.168.217.128:9092) 3、java代码客户端…...
有经验的合肥网站建设/软件公司
XSS的原理分析与解剖 001 前言: 《xss攻击手法》一开始在互联网上资料并不多(都是现成的代码,没有从基础的开始),直到刺的《白帽子讲WEB安全》和cn4rry的《XSS跨站脚本攻击剖析与防御》才开始好转。 我这里就不说什么xss的历史什么东西了,xss…...
中小网站建设都有哪些方案/网络营销学校
学习整理,部分描述来源于网络 1. 概述 1.1 定义 k近邻法(k-nearest neighbor,k-NN)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近…...