追梦之旅【数据结构篇】——详解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、各层的作用 应用层(可以想象成是快递打包过程) 决定了向用户提供应用服务时通信的活动,将要进行的操作或者数据进行一个打包。 传输层(可以理解为选择顺丰、圆通等快递公司) 提供数据传输的方…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...