追梦之旅【数据结构篇】——详解C语言动态实现顺序表
详解C语言动态实现顺序表~😎
- 前言🙌
- 顺序表概念及结构🙌
- 功能函数的具体实现分析:🙌
- 尾插函数具体实现:
- 尾删函数具体实现:
- 头插函数具体实现:
- 头删插函数具体实现:
- 任意插函数具体实现:
- 任意删函数具体实现:
- 销毁顺序表函数具体实现:
- 查找函数具体实现:
- 检查容量函数具体实现:
- 初始化函数具体实现:
- 打印函数具体实现:
- 头文件全部源码分享🙌
- 功能文件全部源码分享🙌
- 测试文件代码🙌
- 总结撒花💞
😎博客昵称:博客小梦
😊最喜欢的座右铭:全神贯注的上吧!!!
😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主!
😘博主小留言:哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘
前言🙌
哈喽各位友友们😊,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!😘我仅已此文,手把手带领大家学习C语言动态实现顺序表~ 都是精华内容,可不要错过哟!!!😍😍😍
顺序表概念及结构🙌
在实现顺序表之前,我们先要了解一下什么是顺序表,它的大概结构是怎么样的?其实顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

顺序表一般可以分为:
- 静态顺序表:使用定长数组存储元素。
- 动态顺序表:使用动态开辟的数组存储。
其实静态实现和动态实现的方法都差不多,但是相比而言动态实现的顺序表的性能更优,实际应用的价值更大,比较灵活。
实现大概思路分析:
首先在头文件先定义结构体和各个功能函数的声明,并把有关的头文件包含上去。各个函数如何实现的,主要是对各个函数的实现,用到realloc动态开辟新节点的空间,用assert断言确保指针有效,通过画图来帮助理清代码实现的思路,指针的指向如何,要考虑哪些情况。然后再测试代码中,将上述代码都进行测试,显示结果。
功能函数的具体实现分析:🙌
尾插函数具体实现:
设计思路分析:
- 首先设计一个检查容量的函数,保证有空间才能进行插入操作。
- 将size为下标的元素改为x,别忘了将size++。
- 或者实现任意插函数之后,而尾插作为其一种特殊情况,可以通过调用任意插函数来实现尾插的功能
//尾插
void SeqListPushBack(SL* p, DataSeqList x)
{/*SeqListCheckCapacity(p);p->arr[p->size] = x;p->size++;*/SeqListInsert(p, p->size, x);
}
尾删函数具体实现:
设计思路分析:
- 先assert检查顺序表的元素个数,如果没有元素就不用再删了
- 直接将size减减即可。这样其有效个数就少了一个,十分简单。
- 或者实现任意删函数之后,而尾删作为其一种特殊情况,可以通过调用任意删函数来实现尾删的功能
//尾删
void SeqListPopBack(SL* p)
{/*assert(p->size);p->size--;*/SeqListEraes(p, p->size - 1);
}
头插函数具体实现:
设计思路分析:
- 首先设计一个检查容量的函数,保证有空间才能进行插入操作。
- 注意挪动数据如何挪,将控制条件控制好即可。
- 将首元素改为x,别忘了将size++。
- 或者实现任意插函数之后,而头插作为其一种特殊情况,可以通过调用任意插函数来实现头插的功能
//头插
void SeqListPushFront(SL* p, DataSeqList x)
{//SeqListCheckCapacity(p);挪动数据//int end = p->size - 1;//while (end >= 0)//{// p->arr[end + 1] = p->arr[end];// end--;//}//p->arr[0] = x;//p->size++;SeqListInsert(p,0, x);
}
头删插函数具体实现:
设计思路分析:
- 先assert检查顺序表的元素个数,如果没有元素就不用再删了。
- 注意数据挪动,可以采用画图分析的方法控制挪动数据的控制条件。
- 不要忘了将size-减减。
- 或者实现任意删函数之后,而头删作为其一种特殊情况,可以通过调用任意删函数来实现头删的功能
//头删
void SeqListPopFront(SL* p)
{删完就不用删了//assert(p->size);//int begin = 1;//while (begin < p->size)//{// p->arr[begin - 1] = p->arr[begin];// begin++;//}//p->size--;SeqListEraes(p, 0);
}
任意插函数具体实现:
设计思路分析:
- 先判断容量,有空间才进行插入操作。
- 检查插入的合法性,在pos >= 0 && pos <= p->size 的范围才能进行插入
- 注意数据挪动,可以采用画图分析的方法控制挪动数据的控制条件。
- 别忘了将size加加
//任意插
void SeqListInsert(SL* p,int pos ,DataSeqList x)
{SeqListCheckCapacity(p);assert(pos >= 0 && pos <= p->size);int end = p->size - 1;while (end >= pos){p->arr[end + 1] = p->arr[end];end--;}p->arr[pos] = x;p->size++;}
任意删函数具体实现:
设计思路分析:
- 先判断顺序表有没有数据,没有就不用删了。
- 检查删的位置的合法性,在pos >= 0 && pos < p->size的范围才能进行删除。
- 注意数据挪动,可以采用画图分析的方法控制挪动数据的控制条件。
- 别忘了将size减减。
//任意删
void SeqListEraes(SL* p, int pos)
{//删完就不用删了assert(p->size);//删的合法性判断assert(pos >= 0 && pos < p->size);int begin = pos+1;while (begin < p->size){p->arr[begin - 1] = p->arr[begin];begin++;}p->size--;
}
销毁顺序表函数具体实现:
设计思路分析:
因为顺序表的空间建立是动态开辟的,动态开辟的空间需要手动free释放。
/销毁
void SeqListDestory(SL* p)
{free(p->arr);p->arr = NULL;p->capacity = p->size = 0;
}
查找函数具体实现:
设计思路分析:
这个比较简单,直接写个循环遍历一遍,找到了x就返回它的下标,找不到返回-1.
//查找
int SeqListFind(SL* p, DataSeqList x)
{assert(p);for (int i = 0; i < p->size; i++){if (p->arr[i] == x){return i;}}return -1;
}
检查容量函数具体实现:
设计思路分析:
- 分为没有空间和空间满了两种情况进行。
- 如果没有空间,就显动态分配四个数据大小的空间。
- 如果空间存储满了,就动态扩容到原来的2倍空间。
//检查容量
void SeqListCheckCapacity(SL* p)
{if (p->size == p->capacity){int newcapacity = p->capacity == 0 ? 4 : p->capacity * 2;DataSeqList* tem = realloc(p->arr, newcapacity * sizeof(DataSeqList));assert(tem);p->arr = tem;p->capacity = newcapacity;}
}
初始化函数具体实现:
设计思路分析:
将p->arr = NULL;p->capacity = p->size = 0;
//初始化
void SeqListInit(SL* p)
{assert(p);p->arr = NULL;p->capacity = p->size = 0;
}
打印函数具体实现:
设计思路分析:
这个比较简单,直接写个循环遍历一遍打印即可。
//打印
void SeqListPrintf(SL* p)
{int i = 0;for (i = 0; i < p->size; i++){printf("%d ", p->arr[i]);}printf("\n");
}
头文件全部源码分享🙌
这里负责函数功能的声明和库函数头文件的包含,写任何一个项目时,可以先把头文件编写好,也就是理清一下项目需要实现哪些功能函数,整理一下项目的整体思路。
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>#define DataSeqList inttypedef struct SeqList
{DataSeqList* arr;int size;int capacity;
}SL;//初始化
void SeqListInit(SL* p);
//尾插
void SeqListPushBack(SL* p, DataSeqList x);
//尾删
void SeqListPopBack(SL* p);
//头插
void SeqListPushFront(SL* p, DataSeqList x);
//头删
void SeqListPopFront(SL* p);
//任意插
void SeqListInsert(SL* p, int pos, DataSeqList x);
//任意删
void SeqListEraes(SL* p, int pos);
//打印
void SeqListPrintf(SL* p);
//销毁
void SeqListDestory(SL* p);
//查找
int SeqListFind(SL* p, DataSeqList x);
//检查容量
void SeqListCheckCapacity(SL* p);
功能文件全部源码分享🙌
#include"SeqList.h"//初始化
void SeqListInit(SL* p)
{assert(p);p->arr = NULL;p->capacity = p->size = 0;
}//尾插- 会遇到三种情况
// 1 - 没有空间 2 - 空间不足,要扩容(查容量) 3 - 空间足够,插入数据//检查容量
void SeqListCheckCapacity(SL* p)
{if (p->size == p->capacity){int newcapacity = p->capacity == 0 ? 4 : p->capacity * 2;DataSeqList* tem = realloc(p->arr, newcapacity * sizeof(DataSeqList));assert(tem);p->arr = tem;p->capacity = newcapacity;}
}//打印
void SeqListPrintf(SL* p)
{int i = 0;for (i = 0; i < p->size; i++){printf("%d ", p->arr[i]);}printf("\n");
}//尾插
void SeqListPushBack(SL* p, DataSeqList x)
{/*SeqListCheckCapacity(p);p->arr[p->size] = x;p->size++;*/SeqListInsert(p, p->size, x);
}//尾删
void SeqListPopBack(SL* p)
{/*assert(p->size);p->size--;*/SeqListEraes(p, p->size - 1);
}
//头插
void SeqListPushFront(SL* p, DataSeqList x)
{//SeqListCheckCapacity(p);挪动数据//int end = p->size - 1;//while (end >= 0)//{// p->arr[end + 1] = p->arr[end];// end--;//}//p->arr[0] = x;//p->size++;SeqListInsert(p,0, x);
}
//头删
void SeqListPopFront(SL* p)
{删完就不用删了//assert(p->size);//int begin = 1;//while (begin < p->size)//{// p->arr[begin - 1] = p->arr[begin];// begin++;//}//p->size--;SeqListEraes(p, 0);
}//任意插
void SeqListInsert(SL* p,int pos ,DataSeqList x)
{SeqListCheckCapacity(p);assert(pos >= 0 && pos <= p->size);int end = p->size - 1;while (end >= pos){p->arr[end + 1] = p->arr[end];end--;}p->arr[pos] = x;p->size++;}
//任意删
void SeqListEraes(SL* p, int pos)
{//删完就不用删了assert(p->size);//删的合法性判断assert(pos >= 0 && pos < p->size);int begin = pos+1;while (begin < p->size){p->arr[begin - 1] = p->arr[begin];begin++;}p->size--;
}//销毁
void SeqListDestory(SL* p)
{free(p->arr);p->arr = NULL;p->capacity = p->size = 0;
}//查找
int SeqListFind(SL* p, DataSeqList x)
{assert(p);for (int i = 0; i < p->size; i++){if (p->arr[i] == x){return i;}}return -1;
}
测试文件代码🙌
#define _CRT_SECURE_NO_WARNINGS 1#include"SeqList.h"void test1()
{SL s;SeqListInit(&s);SeqListPushBack(&s, 1);SeqListPushBack(&s, 2);SeqListPushBack(&s, 3);SeqListPushBack(&s, 4);SeqListPushBack(&s, 5);SeqListPrintf(&s);SeqListPopBack(&s);SeqListPopBack(&s);SeqListPrintf(&s);SeqListPushFront(&s, 10);SeqListPushFront(&s, 20);SeqListPushFront(&s, 30);SeqListPushFront(&s, 40);SeqListPrintf(&s);SeqListPopFront(&s);SeqListPopFront(&s);SeqListPrintf(&s);SeqListDestory(&s);}void test2()
{SL s;SeqListInit(&s);SeqListPushBack(&s, 1);SeqListPushBack(&s, 2);SeqListPushBack(&s, 3);SeqListPushBack(&s, 4);SeqListPushBack(&s, 5);SeqListPrintf(&s);SeqListInsert(&s, 3, 30);SeqListPrintf(&s);SeqListEraes(&s, 3);SeqListEraes(&s, 2);SeqListPrintf(&s);SeqListDestory(&s);
}
void test3()
{SL s;SeqListInit(&s);SeqListPushBack(&s, 1);SeqListPushBack(&s, 2);SeqListPushBack(&s, 3);SeqListPushBack(&s, 4);SeqListPushBack(&s, 5);SeqListPrintf(&s);SeqListInsert(&s, 3, 30);SeqListEraes(&s, 2);SeqListPrintf(&s);SeqListDestory(&s);
}void test4()
{SL s;printf("尾插数据1,2,3,4,5\n");SeqListInit(&s);SeqListPushBack(&s, 1);SeqListPushBack(&s, 2);SeqListPushBack(&s, 3);SeqListPushBack(&s, 4);SeqListPushBack(&s, 5);SeqListPrintf(&s);printf("头插数据10, 20 , 30\n");SeqListPushFront(&s, 10);SeqListPushFront(&s, 20);SeqListPushFront(&s, 30);SeqListPrintf(&s);SeqListDestory(&s);
}int main()
{//test1();//test2();//test3();test4();return 0;
}
部分功能测试结果图:

总结撒花💞
本篇文章旨在分享详解C语言动态实现顺序表。希望大家通过阅读此文有所收获!😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘
相关文章:
追梦之旅【数据结构篇】——详解C语言动态实现顺序表
详解C语言动态实现顺序表~😎前言🙌顺序表概念及结构🙌功能函数的具体实现分析:🙌尾插函数具体实现:尾删函数具体实现:头插函数具体实现:头删插函数具体实现:任意插函数具…...
xss基础
目录标题一、XSS的原理二、XSS漏洞分类1、反射型xss2、存储型XSS3、基于DOM的XSS三、XSS漏洞的危害及验证四、XSS漏洞的黑盒测试五、XSS漏洞的白盒测试一、XSS的原理 跨站脚本攻击XSS(Cross Site Scripting),为了不和层叠样式表(…...
移动WEB开发二、流式布局
零、文章目录 文章地址 个人博客-CSDN地址:https://blog.csdn.net/liyou123456789个人博客-GiteePages:https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee:https://gitee.com/bluecusliyou/TechLearnGithub:https:…...
分享在线预约系统制作步骤_在线预约链接怎么做
在微信小程序上进行在线预约,不管是商家还是顾客,都可以自由选择时间,顾客还可以通过预约小程序,了解到所选服务的详情和功能特色,不必等到去店内听介绍,顾客能节省等候时间,商家能解放招待人力…...
【每日一题Day125】LC1326灌溉花园的最少水龙头数目 | 动态规划 贪心
灌溉花园的最少水龙头数目【LC1326】 在 x 轴上有一个一维的花园。花园长度为 n,从点 0 开始,到点 n 结束。 花园里总共有 n 1 个水龙头,分别位于 [0, 1, ..., n] 。 给你一个整数 n 和一个长度为 n 1 的整数数组 ranges ,其中 …...
C# FFmpeg推流Vlc.DotNet拉流优化参数
FFmpeg是流媒体开源神器,视频转换、剪裁包括推流,无所不能,很多系统都是基于其开发的。拉流可以用FFplay,但是不利于集成到自己的代码中,因此拉流选择了Vlc.DotNet。 在使用中,仅使用默认参数,…...
pnpm v8版本升级变化关注点(前瞻速攻版)
前言 pnpm v8.0.0-alpha.0 版本已经发布,包含少量变化,但其中还是有令人在意的点的。 本文将默认读者拥有大部分 pnpm v7 版本的知识储备,进行 v8 版本的前瞻速攻。 安装方法 目前通过指定 Tag 方式可以安装 v8 alpha 版: npm…...
Python基础-环境安装
Python安装1.下载PythonPython网址:https://www.python.org/进入Python官网,点击Downloads,选择自己对应的操作系统(此处以Windows为例)在左侧的稳定发行版中,选择一个3.5版本以上的,然后点击对…...
重载、重写、重构概念辨析
首先,重载、重写、重构都表现为方法名相同 重载 重载(overload),表示同一类的方法之间的关系,至少有以下其中一种情况 参数个数不同参数类型不同参数顺序不同 注意,返回值类型不同不能作为重载依据 重…...
第九章 - 多表查询(join,left join 等)与合并查询(union union all)
第九章 - 多表查询(join,left join 等)与合并查询(union)交叉链接(笛卡尔积)内连接查询外连接查询左链接: left join右链接:right join组合查询 union & union all使…...
matplotlib学习笔记(持续更新中…)
目录 1. 安装,导入 2. figure,axes(图形,坐标图形) 2.1 figure对象 2.2 axes对象 2.3 代码演示 2.3 subplot() 方法 3. 图表的导出 3.1 savefig() 方法 3.2 代码演示 1. 安装,导入 pip install m…...
STM32 SystemInit()函数学习总结
拿到程序后如何看系统时钟?User文件夹——system_stm32f4xx程序,先找systemcoreclock(系统时钟)但是这里这么多个系统时钟应该如何选择?点击魔法棒,然后点击C/C可以看到define的是F40_41XXX.USE这一款 ,对应着就找出了…...
【Spring Boot 原理分析】- 自动配置
【Spring Boot 原理分析】- 自动配置 Condition 注解 Condition 是 Spring 4.0 增加的条件判断功能,通过这个功能可以实现选择的创建 Bean 操作 👑 我们在使用 Spring 的时候,只需导入某个依赖的坐标,就可以直接通过 Autwired 注…...
简明易懂的JVM理解
文章目录简明易懂的JVM和GC理解写在前面Java虚拟机(JVM)的组成基本介绍结构类加载子系统(ClassLoader SubSystem)介绍类加载过程类加载过程小结双亲委派模型(Parent-Delegation Model)简介优点Java9的类加载的委派关系变动双亲委派模型小结运行时数据区(Runtime Data Areas)介绍…...
新考纲下的PMP考试有多难?
PMP考试在6月25号考试结束后,在网上引起一片哗然,新考纲领域与考点的转变使得考试难度加大:PMP考试敏捷和混合内容比重大,考试难度加大很多;考题更加注重考生的知识应用能力,领域更宽; 接下来我…...
朗润国际期货:知名投行/大佬打Call记
知名投行/大佬打Call记 2023年知名投行/大佬看好哪些投资标的 中国股市 高盛(2023年1月):将上涨15% 花旗(2023年1月):上半年会成为投资两点 摩根大通(2022年11月):M…...
遗传算法及Python实现
0 建议学时 4学时 1 人工智能概述 2020中国人工智能产业年会在苏州召开,会上发布的《中国人工智能发展报告2020》显示,过去十年(2011-2020) ,中国人工智能专利申请量达389571件,占全球总量的74.7%,位居世界第一。 报…...
零基础 Ubuntu 20.04.01 下搭建51单片机开发环境[开源编译器SDCC]
原创首发于CSDN,转载请注明出处,谢谢! 文章目录为何会在Linux下开发单片机个人系统环境与所用开发板安装开源编译器 sdccSTC MCU ISP 闪存工具 stcgal 的安装单片机代码的编译与测试|编写主代码 main.c|使用 sdcc 编译…...
手摸手快速入门 正则表达式 (Vue源码中的使用)
vue2源码 在 vue2 源码的 src\compiler\parser\html-parser.js 文件中 里面有大量的正则表达式,如下图 可以看到非常的长,不是我说,就前几行,如果没有相关的 正则表达式 的工具,我可能就被劝退了😭 这里…...
TCP/IP网络协议族分成及其每层作用
1、可以分为应用层、传输层、网络层、链路层 2、各层的作用 应用层(可以想象成是快递打包过程) 决定了向用户提供应用服务时通信的活动,将要进行的操作或者数据进行一个打包。 传输层(可以理解为选择顺丰、圆通等快递公司) 提供数据传输的方…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

