数据结构--顺序表(实现增删改查)
三个文件(Mytest.c 、MySeqList.c 、 MySeqList.h)
Mytest.c测试函数
MySeqList.c 函数定义
MySeqList.h函数声明
增删改查的步骤:
初始化
增加元素
• 尾插:先检查顺序表空间是否足够,若不足则进行扩容,然后将新元素插入到顺序表末尾,更新元素个数。
• 头插:先检查空间是否足够,然后将顺序表中已有元素依次向后移动一位,再将新元素插入到表头,更新元素个数。
• 任意位置插入:先检查插入位置是否合法以及空间是否足够,然后将插入位置及之后的元素依次向后移动一位,再将新元素插入到指定位置,更新元素个数。
删除元素
• 尾删:直接将顺序表的元素个数减1,逻辑上删除了最后一个元素。
• 头删:将顺序表中除第一个元素外的其他元素依次向前移动一位,覆盖原来的第一个元素,然后更新元素个数。
• 任意位置删除:先检查删除位置是否合法,然后将删除位置之后的元素依次向前移动一位,覆盖要删除的元素,更新元素个数。
修改元素
• 检查要修改的位置是否合法,然后直接将指定位置的元素值修改为新的值。
查询元素
• 遍历顺序表中的元素,将每个元素与要查找的值进行比较,若找到相等的元素,则返回该元素的位置;若遍历完整个顺序表都未找到,则返回 -1。
一、MySeqList.h
1、首先创建一个结构体(剩下的就是函数声明)
#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
typedef int SLdatatype;
#define INIT_CAPCITY 3 //初始化空间大小
#define ADD_CAPCITY 2 //增容大小typedef struct SLSeqList
{SLdatatype* arr;//让a在初始化函数中初始化,让a指向一块空间int size;//用于记录顺序表中当前已经存储的元素个数int capcity; //最多能存储几个数量(不够大可以扩容)当size达到capcity.
}SL;void SLInit(SL* p);
void SLpushBack(SL* p, SLdatatype x);
void SLpopBack(SL* p);
void SLPrint(SL* p);void SLPushFront(SL* p , SLdatatype x);
void SLPopFront(SL* p);
void SLInsert(SL* p, int pos, SLdatatype x);
void SLErase(SL* p, int pos);
void SLModify(SL* p, int pos, SLdatatype newVal);
int SLFind(SL* p, SLdatatype x);
void SLDestroy(SL* p);
二、MySeqList.c实现
#define _CRT_SECURE_NO_WARNINGS
#include"my_SeqList.h"//初始化
void SLInit(SL *p)
{assert(p);p->arr = (SLdatatype*)calloc(INIT_CAPCITY,sizeof(SLdatatype));if (p->arr == NULL){perror("calloc");return;}p->size = 0;p->capcity = INIT_CAPCITY;// 初始化为3 在 my_SeqList.h中定义 #define INIT_CAPCITY 3
}//判断是否需要扩容
void SLCapaty(SL* p)
{if (p->size == p->capcity){SLdatatype* tmp = (SLdatatype*)realloc(p->arr,sizeof(SLdatatype) * p->capcity * 2);if (p->arr == NULL){perror("calloc");return;}p->arr = tmp;p->capcity += ADD_CAPCITY;}
}//尾插
void SLpushBack(SL* p , SLdatatype x)
{assert(p);//增加内容前判断空间是否够用?SLCapaty(p);p->arr[p->size++] = x;
}//尾删
void SLpopBack(SL* p)
{assert(p->size > 0);//温柔检查/*if (p->size == 0)return;*/p->size--;
}//头插
void SLPushFront(SL *p , SLdatatype x)
{assert(p);SLCapaty(p);int end = p->size-1;while (end >= 0){p->arr[end + 1] = p->arr[end];end--;}p->arr[0] =x;p->size++;
}
//头删
void SLPopFront(SL* p)
{assert(p);assert(p->size > 0); //元素个数size如果不大于0(即没有数据,就不需要往西执行了)int begin = 1;while (begin < p->size){p->arr[begin - 1] = p->arr[begin];++begin;}p->size--;
}
//任意位置插入数据
//传入一个结构体 , pos位置(要插入的位置),int x
void SLInsert(SL* p , int pos , SLdatatype x)
{assert(p);//这里已经进行了判断:<=p->size,所以不会越界assert(pos >= 0 && pos <=p->size);SLCapaty(p);int end = p->size - 1;while (end >= pos){p->arr[end + 1] = p->arr[end];--end;}p->arr[pos] = x;//如果在插入元素之前就将 p->size // 加 1,那么在插入元素时, p->size // 的值就会比实际的元素个数多 1p->size++;
}
//任意位置删除数据
void SLErase(SL* p, int pos)
{assert(p);//这里已经进行了判断:<=p->size,所以不会越界assert(pos >= 0 && pos < p->size);//pos 位置的元素即将被删除,不需要参与移动操作。int begin = pos + 1;//只能从后往前挪,从前完后挪会被覆盖while (begin < p->size){//eg:1,2,3,4,5,6 删除3//pos=2 下标[2+1] , 4,5,6往前挪p->arr[begin -1] = p->arr[begin];++begin;}p->size--;
}
//查找数据
int SLFind(SL *p , SLdatatype x)
{assert(p);int i = 0;for (i = 0; i < p->size; i++){if (p->arr[i] == x){return i;} }return -1;
}
// 修改顺序表中指定位置的元素值
void SLModify(SL* p, int pos, SLdatatype newVal){assert(p);// 检查位置是否合法,pos 必须在 0 到 p->size - 1 之间assert(pos >= 0 && pos < p->size);// 直接将指定位置的元素修改为新值p->arr[pos] = newVal;
}
void SLPrint(SL* p)
{assert(p);int i = 0;for (i = 0; i < p->size; i++){printf("%d ",p->arr[i]);}printf("\n");
}
void SLDestroy(SL* p)
{assert(p);free(p->arr);p->arr = NULL;p->capcity = p->size = 0;//p = NULL; //结构体p是全局 所以不需要释放,程序结束会销毁
}
1. 数据结构初始化SLInit(SL *p):分配初始内存,初始化元素个数为0、空间容量
2. 判断是否需要扩容 SLCapaty(SL* p)
什么时候需要判断呢? 插入数据数据之前判断空间是否够大

3. 数据插入操作SLpushBack(SL* p , SLdatatype x):插入前都会调用SLCapaty检查是否需要扩容,插入时会相应移动元素并更新size。
p->arr[p->size++] = x;:它的作用是将新元素 x 赋值给顺序表数组 p->arr 中当前元素个数 p->size 所对应的位置(因为 p->size 作为下标使用后才自增),然后 p->size 的值会自动增加 1,从而实现了在顺序表的尾部插入一个新元素的功能。

4. 数据删除操作:尾删SLpopBack,直接size--,就不会访问到最后一个元素了,这样就实现了尾删。
头删SLPopFront(SL* p):
int begin = 1;:定义一个整型变量 begin 并初始化为 1,用于从顺序表的第二个元素(下标为 1)开始遍历。因为要删除第一个元素(下标为 0),所以从第二个元素开始处理。
while (begin < p->size):只要 begin 小于顺序表当前的元素个数 p->size,就会继续循环。
循环的目的是将后续元素依次向前移动一位,覆盖掉前面的元素。
p->arr[begin - 1] = p->arr[begin];:在循环体中,将下标为 begin 的元素的值赋给下标为 begin - 1 的位置。这样就实现了将当前元素向前移动一位,覆盖掉原来前一个位置的元素。例如,原本 p->arr[1] 的值会覆盖 p->arr[0] 的值,p->arr[2] 的值会覆盖 p->arr[1] 的值,以此类推。

5. 查找与修改:SLFind函数遍历顺序表查找指定元素,返回其下标,未找到则返回-1;SLModify函数用于修改指定位置的元素值。
6. 打印:SLPrint函数用于打印顺序表中的所有元素;
7、SLDestroy函数释放顺序表占用的内存,并将相关成员变量置为0和NULL 。
三、Mytest.c
#define _CRT_SECURE_NO_WARNINGS
#include"my_SeqList.h"//SLpushBack();头插
//SLpopBack();尾删void test1()
{SL s;SLInit(&s);
//---------------尾插---尾删----------------SLpushBack(&s , 1); //尾插,插入数字1SLpushBack(&s , 2);//尾插SLpushBack(&s , 3);//尾插SLpushBack(&s , 4);//尾插SLpushBack(&s , 5);//尾插SLpushBack(&s , 6);//尾插SLpushBack(&s , 7);//尾插SLpushBack(&s , 8);//尾插SLpushBack(&s , 9);//尾插SLPrint(&s);SLpopBack(&s);//尾删一个SLpopBack(&s);//尾删一个SLpopBack(&s);//尾删一个//----------头插---头删-------------SLPushFront(&s,10); //头插入一个数据SLPushFront(&s,20); //头插入一个数据SLPushFront(&s,30); //头插入一个数据SLPrint(&s);SLPopFront(&s);//头部删除一个数据SLPopFront(&s);//头再删除一个数据SLPrint(&s);//----------任意位置插入/删除------------SLInsert(&s, 2,6);SLPrint(&s);SLErase(&s,3);SLPrint(&s);//查找int ret = SLFind(&s, 6);//查6 在哪个位置printf("%d\n", ret);//打印位置SLModify(&s,0, 200);//从0位置开始的SLPrint(&s);SLDestroy(&s);
}
int main()
{test1(); return 0;
}
相关文章:
数据结构--顺序表(实现增删改查)
三个文件(Mytest.c 、MySeqList.c 、 MySeqList.h) Mytest.c测试函数 MySeqList.c 函数定义 MySeqList.h函数声明 增删改查的步骤: 初始化 增加元素 • 尾插:先检查顺序表空间是否足够,若不足则进行扩容&#x…...
【android】补充
3.3 常用布局 本节介绍常见的几种布局用法,包括在某个方向上顺序排列的线性布局,参照其他视图的位置相对排列的相对布局,像表格那样分行分列显示的网格布局,以及支持通过滑动操作拉出更多内容的滚动视图。 3.3.1 线性布局Linea…...
HTML 表单处理进阶:验证与提交机制的学习心得与进度(一)
引言 在前端开发的广袤领域中,HTML 表单处理堪称基石般的存在,是构建交互性 Web 应用不可或缺的关键环节。从日常频繁使用的登录注册表单,到功能多样的搜索栏、反馈表单,HTML 表单如同桥梁,紧密连接着用户与 Web 应用…...
23.linux下电脑健康检查
电脑健康检查 硬盘 工具 sudo apt-get install smartmontools检查命令 sudo smartctl -a /dev/sdb1输出结果 # smartctl 7.2 2020-12-30 r5155 [x86_64-linux-6.8.0-52-generic] (local build) # Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools…...
数据库自然连接详解
各类资料学习下载合集 https://pan.quark.cn/s/8c91ccb5a474 数据库自然连接详解 自然连接(Natural Join)是一种在关系型数据库中用于合并两个或多个表的数据的操作。它基于表之间的公共列,自动识别具有相同列名的列,并…...
说说MyBatis一、二级缓存和Spring一二级缓存有什么关系?
大家好,我是锋哥。今天分享关于【说说MyBatis一、二级缓存和Spring一二级缓存有什么关系?】面试题。希望对大家有帮助; 说说MyBatis一、二级缓存和Spring一二级缓存有什么关系? 1000道 互联网大厂Java工程师 精选面试题-Java资源…...
蓝桥杯题型分布2
蓝桥杯 蓝桥杯题型分类2素数孪生素数素数个数朴素筛法求素数线性筛法求素数 因数分解试除法分解质因数 等差素数列梅森素数组素数素数环找素数(分段筛)连续素数和小明的素数对疑似素数质数拆分纯质数超级质数质数日期质数游戏2魔法阵的能量阿坤老师切割年糕阶乘分解…...
北京交通大学第三届C语言积分赛
作者有言在先: 题解的作用是交流思路,不是抄作业的。可以把重点放在思路分析上而不是代码上,毕竟每个人的代码风格是不一样的,看别人的代码就跟做程序填空题一样。先看明白思路再看代码。 还有就是,deepseek真的很好用…...
ESP32学习 -从STM32工程架构进阶到ESP32架构
ESP32与STM32项目文件结构对比解析 以下是对你提供的ESP32项目文件结构的详细解释,并与STM32(以STM32CubeIDE为例)的常见结构进行对比,帮助你理解两者的差异: 1. ESP32项目文件解析 文件/目录作用STM32对应或差异set…...
vue响应式原理剖析
一、什么是响应式? 我们先来看一下响应式意味着什么?我们来看一段代码: m有一个初始化的值,有一段代码使用了这个值; 那么在m有一个新的值时,这段代码可以自动重新执行; let m = 20 console.log(m) console.log(m * 2)m = 40上面的这样一种可以自动响应数据变量的代码机…...
【HTML 基础教程】HTML 元素
HTML 文档由 HTML 元素定义。 HTML 元素 开始标签 *元素内容结束标签 *<p>这是一个段落</p><a href"default.htm">这是一个链接</a><br>换行 *开始标签常被称为起始标签(opening tag),结束标签常称…...
解锁智能制造新体验:兰亭妙微 UE/UI 设计赋能行业变革
在智能制造时代的滚滚浪潮中,企业的数字化转型不仅是技术的革新,更是用户体验与交互界面的全面升级。然而,许多制造企业在这一转型过程中,面临着一系列 UI/UE 设计难题,严重阻碍了企业的数字化发展进程。兰亭妙微凭借专…...
Element UI实现表格全选、半选
制作如图所示的表格全选、半选: 父组件 <template><div id"app"><SelectHost :hostArray"hostArray" /></div> </template><script> import SelectHost from ./components/SelectHost.vue export default…...
如何使用动作捕捉系统训练人形机器人
随着人形机器人变得越来越先进,使用动作捕捉系统教会它们如何像人类一样移动成为了人形机器人领域正在研究的全新方向。本文探讨了如何使用Xsens技术捕捉精确的人类运动数据,使机器人能够通过人工智能和机器学习安全高效地学习、适应和执行复杂任务。 近…...
Vue.js 和 Vue 3 全面详解指南
1. Vue.js 基础介绍 1.1 什么是 Vue.js Vue.js(简称 Vue)是一个用于构建用户界面的渐进式 JavaScript 框架。与其他框架不同,Vue 被设计为可以逐步采用。Vue 的核心库只关注视图层,易于上手,便于与其他库或既有项目整合。 Vue 由尤雨溪(Evan You)在 2014 年创建。尤雨…...
OpenRAND可重复的随机数生成库
OpenRAND 是一个 C++ 库,旨在通过提供强大且可复制的随机数生成解决方案来促进可重复的科学研究。它是一个简单的仅头文件库,性能可移植,统计稳健,并且易于集成到任何 HPC 计算项目中。 特征 跨平台支持:OpenRAND 旨在跨各种平台无缝工作,包括 CPU 和 GPU。其仅标题库设计…...
内网渗透技术 Docker逃逸技术(提权)研究 CSMSF
目录 如何通过上传的webshell判断当前环境是否是物理环境还是Docker环境 方法一:检查文件系统 方法二:查看进程 方法三:检查网络配置 方法四:检查环境变量 方法五:检查挂载点 总结 2. 如果是Docker环境&#x…...
生活电子常识——cmd不能使用anaconda的python环境,导致输入python打开应用商店
前言 电脑已经安装了anaconda,从自带的Anaconda Prompt (Anaconda3)中是可以识别python环境的,然而切换到cmd时,突然发现cmd中无法识别anaconda的python环境,竟然打开了应用商店让我安装Python,这当然是不对的。 解决 这是因为…...
如何在linux中部署dns服务 主备dns (详细全过程)
环境centos 7.9 主DNS:192.168.60.131 备DNS:192.168.60.134 我以 chenxingyu0.com 指向 192.168.60.200为例 首先是主dns #!/bin/bash# 检查是否为 root 用户 if [ "$(id -u)" ! "0" ]; thenecho "请使用…...
Oracle到达梦数据库迁移:技术要点与实践分享
一、达梦数据库简介 达梦数据库(DM,Dameng Database)是国内自主研发的具有自主知识产权的大型通用数据库管理系统,具备以下显著特点: 1.高性能:高效的存储与计算分离架构:达梦数据库采用先进的存储与计算分离架构,能够根据业务需求灵活分配存储和计算资源,大大提高了…...
word写latex-Mathtype安装成功-方法
MathType安装报错 想在word写latexMathtype, 网上搜教程安装, 结果一直报错一直删重来, 一直报错一直删了重来 一直报错一直删了重来来来, 就这么反反复复一直不好 网上的教程都是教你不是删mathtype, 就是删office 时代变了啊&#x…...
【踩坑日记】springboot 打包后实现类无法找到
试过了所有改什么目录 依赖 clean都以失败告终 最后将实现类的文件名从Impl改成impl宣布成功 记得使用idea自带的重构...
deepseek(2)——deepseek 关键技术
1 Multi-Head Latent Attention (MLA) MLA的核心在于通过低秩联合压缩来减少注意力键(keys)和值(values)在推理过程中的缓存,从而提高推理效率: c t K V W D K V h t c_t^{KV} W^{DKV}h_t ctKVWDKVht…...
Linux (Centos7)安装Mongodb4.0.28
一、官网下载安装包上传到服务器系统 官网:https://www.mongodb.com/try/download/community 放在/opt/software目录下: 二、解压至/usr/local目录下,并重新命名为mongodb [rootlocalhost software]# tar -zxvf mongodb-linux-x86_64-rhel7…...
数据库设计-笔记4
1.操作词汇简介 insert:用于向表中插入新记录。 delete:用于从表中删除记录。 update:用于修改表中已有的记录。 select:用于从表中检索数据。 2.代码基础(增删改) -- 修改表中的信息 -- 修改表名 alter table s…...
基于python的图书管理系统设计与实现
摘要 21世纪的今天,随着计算机技术和网络技术的的不断推广发展和应用,图书馆管理方式也应该随之而更新,借由人力进行繁杂重复的图书管理工作已经不再可取,人们对于信息科学化的认识,已由低层次向高层次发展࿰…...
10-- 网络攻击防御原理全景解析 | 从单包攻防到DDoS军团作战(包你看一遍全记住)
🛡️ 网络攻击防御原理全景解析 | 从单包攻防到DDoS军团作战 如果你也对网络工程师的内容感兴趣的话,欢迎看我的最新文章9–BGP路由黑洞(超万字大解析):网络世界的“百慕大三角“逃生指南(BGP路由配置实验含路由黑洞,…...
RAG专栏:向量数据库
一、数据库分类 键值数据库(Key-Value):通常用于简单的数据存储,通过键来快速访问数据。文档数据库(Document):用于存储文档结构的数据,如 JSON 格式。图数据库(Graph&a…...
【GPUStack】【dify】【RAGflow】:本地部署GPUStack并集成到dify和RAGflow
目录 Nvidia-Driver CUDA NVIDIA Container Toolkit(新版本的docker不用安装,自带) Docker 部署GPUStack Text Embeddings 部署模型库模型 测试 部署开源模型(modelscope) dify 集成 RAGflow集成 Nvidia-Dri…...
第12章:优化并发_《C++性能优化指南》notes
优化并发 一、并发基础与优化核心知识点二、关键代码示例与测试三、关键优化策略总结四、性能测试方法论多选题设计题答案与详解多选题答案: 设计题答案示例 一、并发基础与优化核心知识点 线程 vs 异步任务 核心区别:std::thread直接管理线程…...
