1.线性表线性表linear list是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构常见的线性表顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构也就说是连续的一条直线。但是在物理结构上并不一定是连续的线性表在物理上存储时通常以数组和链式结构的形式存储。2.顺序表的概念及结构顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构一般情况下采用数组存储。在数组上完成数据的增删查改。顺序表一般可以分为2.1. 静态顺序表使用定长数组存储元素#pragmaoncetypedefintSLDataType;//顺序表数据类型#defineN10//顺序表的大小structSeqList{SLDataType a[N];//定长数组intsize;//有效数据的个数};这就是静态顺序表我们可以看到其实也就是个套壳的数组没办法动态的改变空间所以这里的静态的意思就是固定大小。2.2. 动态顺序表使用动态开辟的数组存储。typedefintSLDataType;structSeqList{SLDataType*arr;intsize;intcapacity;};3.顺序表的接口实现静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了空间开多了浪费开少了不够用。所以现实中基本都是使用动态顺序表根据需要动态的分配空间大小所以下面我们实现动态顺序表。我们用C语言实现顺序表的以下接口//检查扩容函数voidSLCheckCapacity(SeqList*psl);//打印函数voidSeqListPrint(SeqList*psl);// 顺序表初始化voidSeqListInit(SeqList*psl);// 检查空间如果满了进行增容voidSLCheckCapacity(SeqList*psl);// 顺序表尾插voidSeqListPushBack(SeqList*psl,SLDataType x);// 顺序表尾删voidSeqListPopBack(SeqList*psl);// 顺序表头插voidSeqListPushFront(SeqList*psl,SLDataType x);// 顺序表头删voidSeqListPopFront(SeqList*psl);// 顺序表查找intSeqListFind(SeqList*psl,SLDataType x);// 顺序表在pos位置插入xvoidSeqListInsert(SeqList*psl,size_tpos,SLDataType x);// 顺序表删除pos位置的值voidSeqListErase(SeqList*psl,size_tpos);// 顺序表销毁voidSeqListDestory(SeqList*psl);// 顺序表打印voidSeqListPrint(SeqList*psl);//顺序表的排序voidSeqListSort(SeqList*psl);//二分查找intSeqBinarySearch(SeqList*psl,size_tleft,size_tright,SLDataType x);3.1. 顺序表基本功能接口3.1.1. 打印函数为了测试我们所写的接口是否正确我们需要写一个打印函数用来打印顺序表的元素voidSeqListPrint(SeqList*psl){assert(psl);for(inti0;ipsl-size;i){printf(%d ,psl-arr[i]);}printf(\n);}3.1.2. 初始化函数voidSeqListInit(SeqList*s){/*s.size 0; s.arr NULL; s.capacity 0;*/s-arr(SLDataType*)malloc(sizeof(SLDataType)*4);if(s-arrNULL){perror(malloc);exit(-1);//退出程序}s-size0;s-capacity4;}3.1.3. 顺序表销毁我们在创建顺序表的时候我们对顺序表进行malloc开辟空间既然我们开辟了空间在对空间使用结束后我们要将空间归还// 顺序表销毁voidSeqListDestory(SeqList*psl){if(psl!NULL){free(psl-arr);psl-arrNULL;psl-sizepsl-capacity0;}}3.2. 顺序表内存检查扩容接口3.2.1. 检查容量函数我们在执行顺序表的插入操作时可能会造成空间的容量不足这时候我们就要对空间进行扩容很明显我们既然使用malloc函数来初始化函数就可以用realloc函数进行空间的扩容一般我们对空间进行2倍的扩容。voidSLCheckCapacity(SeqList*psl){// 检查容量if(psl-sizepsl-capacity){// 开辟空间时注意当capacity初始化为 0 时直接相乘的结果还是 0 // 所以要先判断一下, 并且需要做 申请空间是否成功的判断// 还不能直接将申请的空间赋值给 目标数组先给一个 临时变量size_tnewCapcitypsl-capacity0?4:psl-capacity*2;SLDataType*tmp(SLDataType*)realloc(psl-arr,newCapcity*sizeof(SLDataType));if(tmpNULL){perror(realloc fail);return;//exit(-1);}psl-arrtmp;psl-capacitynewCapcity;}}3.3. 顺序表增加功能接口3.3.1. 顺序表的头插voidSeqListPushFront(SeqList*psl,SLDataType x){assert(psl);SLCheckCapacity(psl);intend(int)psl-size-1;while(end0){psl-arr[end1]psl-arr[end];end--;}psl-arr[0]x;psl-size;}3.3.2. 顺序表尾插我们在对顺序表进行尾部插入的时候我们在插入前要对顺序表进行容量检查即调用检查容量函数插入结束后顺序表的容量不变有效数据的个数加1voidSeqListPushBack(SeqList*psl,SLDataType x){assert(psl);//如果满了需要增容//一般我们增2倍SLCheckCapacity(psl);psl-arr[psl-size]x;psl-size;}3.3.3. 在顺序表pos位置前插入x首先我们要检查传入的指针 psl 是否为 NULL。如果 psl 是 NULL则程序会触发断言并终止执行。接着我们要检查插入位置 pos 是否有效。插入位置必须在当前顺序表的范围内即从 0 到 psl-size包括 psl-size如果需要在末尾插入插入前我们要先将pos及后面的元素向后移动给插入的位置腾出空间当然插入前我们要进行空间容量的检查。voidSeqListInsert(SeqList*psl,size_tpos,SLDataType x){assert(psl);assert(pospsl-size);SLCheckCapacity(psl);//插入前先检查一下满了没。//向后挪位置size_tendpsl-size;while(posend){psl-arr[end]psl-arr[end-1];end--;}psl-arr[pos]x;psl-size;}3.3.4. 在顺序表pos位置后插入x和在pos位置前插入同理我们只要在向后挪的操作少一次即可//在pos之后位置插入xvoidSeqListInsertBack(SeqList*ps1,size_t pos,SLDataType x){assert(ps1);assert(posps1-sizepos0);SLCheckCapacity(ps1);size_t endps1-size;for(end;endpos1;end--){ps1-arr[end]ps1-arr[end-1];}ps1-arr[pos1]x;ps1-size;}3.4. 顺序表删除功能接口3.4.1. 顺序表的头删我们直接从第二个元素向前移动覆盖第一个元素也就完成了头删操作最后不要忘记修改size的值voidSeqListPopFront(SeqList*psl){assert(psl);intstart0;while(startpsl-size){psl-arr[start]psl-arr[start1];start;}psl-size--;}3.4.2. 顺序表尾删voidSeqListPopBack(SeqList*psl){assert(psl);//psl-arr[psl-size - 1] 0; //可以不加没什么意义psl-size--;}3.4.3. 顺序表删除pos位置的值voidSeqListErase(SeqList*psl,size_tpos){assert(psl);assert(pospsl-size);size_tend--psl-size;while(posend){psl-arr[pos]psl-arr[pos1];end--;}}3.5. 顺序表查找接口3.5.1. 顺序表查找函数我们遍历顺序表如果找到x则返回这个顺序表的下标若没找到返回-1intSeqListFind(SeqList*psl,SLDataType x){assert(psl);for(inti0;ipsl-size;i){if(psl-arr[i]x){returni;//返回数组下标}}return-1;//没找到}3.6. 顺序表其他接口3.6.1. 顺序表的排序小到大我们利用冒泡排序法进行排序//顺序表的排序voidSeqListSort(SeqList*psl){if(psl-size2)return;bool swappedfalse;for(inti0;ipsl-size-1;i){for(intj0;jpsl-size-i-1;j){if(psl-arr[j]psl-arr[j1]){inttemppsl-arr[j];psl-arr[j]psl-arr[j1];psl-arr[j1]temp;swappedtrue;}}if(!swapped)break;}}3.6.2. 二分查找法intSeqBinarySearch(SeqList*psl,size_tleft,size_tright,SLDataType x){intmid0;intfind0;while(leftright){mid(int)(leftright)/2;if(psl-arr[mid]x){rightmid-1;}elseif(psl-arr[mid]x){leftmid1;}else{find1;break;}}if(1find){returnmid;}else{return-1;//没找到}}源代码已绑定了这篇文章需要者自取3.7. 测试函数我们可以在test.c文件进行测试:#define_CRT_SECURE_NO_WARNINGS#includeSeqList.hvoidTestSeqList1(){SeqList s;SeqListInit(s);//初始化SeqListPushBack(s,1);//尾插1SeqListPushBack(s,2);//尾插2SeqListPushBack(s,3);//尾插3SeqListPushBack(s,3);//尾插3SeqListPushBack(s,3);//尾插3SeqListPushBack(s,3);//尾插3SeqListPushBack(s,3);//尾插3SeqListPopBack(s);//尾删SeqListPopBack(s);//尾删SeqListPopBack(s);//尾删SeqListPopBack(s);//尾删SeqListPrint(s);//打印输出顺序表SeqListPushFront(s,6);//头插6SeqListPushFront(s,7);//头插7SeqListPushFront(s,8);//头插8SeqListPrint(s);//打印输出顺序表SeqListPopFront(s);//头删SeqListPopFront(s);//头删SeqListPopFront(s);//头删SeqListPrint(s);//打印输出顺序表printf(%d\n,SeqListFind(s,2));//找2在顺序表的位置SeqListInsert(s,1,6);//在下标为1的地方插入6SeqListPrint(s);//打印输出顺序表SeqListErase(s,2);//删除顺序表下标为2的位置SeqListPrint(s);//打印输出顺序表SeqListPushBack(s,10);//尾插10SeqListPushBack(s,4);//尾插4SeqListSort(s);//排序顺序表SeqListPrint(s);//打印输出顺序表printf(已找到数组下标是%d\n,SeqBinarySearch(s,0,s.size-1,10));//二分查找SeqListDestory(s);//销毁}intmain(){TestSeqList1();return0;}测试结果接口均正确
企业数字化 ERP 产品动态
相关推荐
C++文档数据保存与解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/11 4:19:25
FreeToken 安装指南:PyPI、源码与 Nightly Wheels 三种方式全解析 FreeToken 安装指南:PyPI、源码与 Nightly Wheels 三种方式全解析
FreeToken 是一套面向边缘设备的 MoE 模型推理引擎,目标是在消费级硬件上以交互速度运行大规模模型。本文基于仓库 docs/install.md 整理完整的安装流程,覆盖环境要求、PyPI… · 2026/11/11 13:21:50
Funny Print /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/8 8:37:15
之前考的证在外省能不能转过来?报建要电工证值不值得考 之前考的证在外省能不能转过来?报建要电工证值不值得考 之前考的证在外省能不能转过来?这个问题我听得太多了,特别是那些在工地、工厂、建筑工地转岗的兄弟姐妹,你们可能也在问:我手里这张电工证,在老家考的,现在在外地上班, 报建要电工证… · 2026/11/11 13:21:36
安监规定电工作业人员必须知道的上岗必备信息 安监规定电工作业人员必须知道的上岗必备信息 你是不是刚毕业就急着找工作?或者正在准备换工作?但用人单位一开口就问你有没有 特种作业操作证 ?这可不是开玩笑, 安监规定电工作业人员… · 2026/11/11 13:21:36
特种作业工的年终总结:多久拿证才能拿到手,别被中介坑了 特种作业工的年终总结:多久拿证才能拿到手,别被中介坑了 不知道去哪报名怕被中介坑,这几乎是每个想考特种作业操作证的工友心里最怕的。今年我转岗到了平顶山的一家建筑工地,从电焊工转成高压电工,中间的弯路可不少,最头疼的就是证书的事。很多人以为拿… · 2026/11/11 13:21:36
特种作业工的年终总结:怎么通过官方报名入口拿到证,明年涨薪不愁 特种作业工的年终总结:怎么通过官方报名入口拿到证,明年涨薪不愁 年底了,很多特种作业工都在盘算着自己的年终总结,但有个现实问题卡在心头: 急需特种作业证才能上岗找工作 。没有证,连面试资格都拿不到,更别提谈涨薪了。所以,… · 2026/11/11 13:21:36
柳州电工证哪里换证别怕学历低 网上查询搞定一切 柳州电工证哪里换证别怕学历低 网上查询搞定一切 学历不高怕报不上名?这事儿其实真不难,关键是你得知道怎么走流程。最近不少在柳州的朋友都在问【柳州电工证哪里换证】,其实只要流程清楚、资料齐全,学历并不是绊脚石。而且,现在连 网上查询… · 2026/11/11 13:21:36
特种信号工报名处值不值得考?鹤壁公路工程从业者必看的实操指南 特种信号工报名处值不值得考?鹤壁公路工程从业者必看的实操指南 急需特种作业证才能上岗找工作,特种信号工证到底值不值得考?作为鹤壁从事公路工程的你,可能正被这个问题困扰。特种信号工证不是“锦上添花”,而是“雪中送炭”,尤其是在项目现场、工地施… · 2026/11/11 13:20:36
电工证丢失还能补吗?千万别踩坑,丢了证等于失业 电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/11 12:18:07
电力电缆作业证直播报名入口与办理流程良心建议 电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/10 17:46:39
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/10 17:11:43
_中职电工证最新政策解读 中职电工证在哪考?工地太忙根本没时间复习考试的救星来了 工地太忙根本没时间复习考试,这是很多正在备考 中职电工证 的建筑工友的真实写照。你不是不想考,而是真的没时间。但别担心,这期内容是 新乡初次报考人员… · 2026/11/11 0:00:52
昆明电工证培训价格值不值得考?老电工告诉你真相 昆明电工证培训价格值不值得考?老电工告诉你真相 之前考的证在外省能不能转过来?这个问题是很多在外地打工、换城市生活、或者是想在昆明发展的朋友最关心的。尤其是现在云南发展快,很多企业都在招持证上岗的电工,如果你手头有证但不在本地,那这个证是不… · 2026/11/11 0:00:52
特种电缆张工网上查询全攻略:外省证如何转过来 特种电缆张工网上查询全攻略:外省证如何转过来 之前考的证在外省能不能转过来?这是很多特种作业从业者最关心的问题,尤其是像特种电缆张工这类证书,直接关系到日常工作是否合规、能否顺利晋升。很多小伙伴因为证书归属地的问题,陷入职业发展的瓶颈,甚至… · 2026/11/11 0:00:52
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 20:19:29
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 19:22:45
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 17:00:47