【C项目】顺序表
简介:本系列博客为C项目系列内容,通过代码来具体实现某个经典简单项目
适宜人群:已大体了解C语法同学
作者留言:本博客相关内容如需转载请注明出处,本人学疏才浅,难免存在些许错误,望留言指正
作者博客链接:睡觉待开机
下面是本项目的大体思路梳理:

引言:
一般来说,顺序表作为基本的数据结构类型是不需要我们进行实现的,因为一些高级语言比如C++或者java直接具备的这样的内置数据结构,但是为了深入了解顺序表的底层,这里也是建议自己动手用C写一下,一是便于复习C学到的知识,二是更加深入了解顺序表的实现底层逻辑。
1.顺序表思路
为了明晰顺序表的实现思路,我们首先来铺垫一下我到底要在怎么写一个顺序表。
首先啥是顺序表?
一种线性表,底层是数组,只不过这个顺序表所谓的数组不单单可以放各种类型的数据,还可以有各种接口,包括增删查改操作的接口等等。
注:线性表的概念:逻辑结构上是连续的,物理结构不一定连续的数据结构称为线性表。
顺序表的概念:逻辑结构上是连续的,物理结构上也是连续的,底层是以数组为实现,有着增删查改各种接口的基本数据组织结构。

那么我就可以大致明白了我要写一个顺序表,这个顺序表实现了一些功能。
首先我要写一个顺序表的话,要有一个顺序表的大体类型吧,所以我就写了一个动态顺序表的类型
typedef int SLDateType;typedef struct SeqList
{SLDateType* arr;int size;int capacity;
}SL;

然后我想要在这个顺序表中实现各种功能(接口),那这个顺序表首先得初始化吧,有初始化顺序表了那肯定对应着销毁这个接口,自然也需要顺序表销毁,然后还要有头插尾插任意插入这个”增“的功能,还有有头删尾删任意删的这个”删“的共能,然后还要有查找功能,还要修改功能,那么我针对该顺序表的每个接口专门搞一个函数
为了便于代码书写,我将各种接口以及顺序表类型本身定义在SeqList.h头文件中进行声明与定义:
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>typedef int SLDateType;typedef struct SeqList
{SLDateType* arr;int size;int capacity;
}SL;//初始化和销毁
void SLInit(SL* ps);
void SLDestroy(SL* ps);
void SLPrint(SL* ps);//顺序表的头部输入/尾部输入
void SLPushBack(SL* ps,SLDateType x);
void SLPushFront(SL* ps, SLDateType x);//顺序表的头部删除/尾部删除
void SLPopBack(SL* ps);
void SLPopFront(SL* ps);//指定位置放入/删除数据
void SLInsert(SL* ps, int pos, SLDateType x);
void SLErase(SL* ps, int pos);//查找数据
int SLFind(SL* ps, SLDateType x);//修改数据
void SLModify(SL* ps, int pos, SLDateType x);
2.具体实现各种接口
顺序表初始化接口:
void SLInit(SL* ps)
{assert(ps);ps->arr = NULL;ps->capacity = ps->size = 0;
}
顺序表初始化插图:

顺序表销毁接口:
void SLDestroy(SL* ps)
{assert(ps);if (ps->arr){free(ps->arr);}ps->arr = NULL;ps->capacity = ps->size = 0;
}
顺序表销毁插图:

顺序表扩容接口:
void SLCheckCapacity(SL* ps)
{assert(ps);if (ps->capacity == ps->size){//小问题:刚开始的时候,sl->capacity是0值int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDateType* temp = realloc(ps->arr,sizeof(SLDateType)*newcapacity);if (!temp){perror("realloc fail!");return;}ps->arr = temp;ps->capacity = newcapacity;}
}
顺序表扩容插图:

顺序表插入接口
void SLPushBack(SL* ps,SLDateType x)
{assert(ps);//1.空间不足需要扩大容量//2.空间足够直接放入数据SLCheckCapacity(ps);ps->arr[ps->size] = x;ps->size++;
}void SLPushFront(SL* ps, SLDateType x)
{assert(ps);SLCheckCapacity(ps);//挪动数据int i = 0;for (i = ps->size - 1; i >= 0; i--){ps->arr[i+1] = ps->arr[i];}//放入数据*(ps->arr) = x;ps->size++;
}
void SLInsert(SL* ps, int pos, SLDateType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);int i = 0;for (i = ps->size - 1; i >= pos; i--){ps->arr[i+1] = ps->arr[i];}ps->arr[pos] = x;ps->size++;
}
头插的插图:

尾插的插图:

任意插入的插图:

顺序表删除接口:
void SLPopBack(SL* ps)
{assert(ps);assert(ps->size);ps->size--;
}void SLPopFront(SL* ps)
{assert(ps);assert(ps->size);int i = 0;for (i = 1; i < ps->size; i++){ps->arr[i-1] = ps->arr[i];}ps->size--;
}
void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);int i = 0;for (i = pos + 1; i < ps->size; i++){ps->arr[i-1] = ps->arr[i];}ps->size--;
}
头删插图:

尾删插图:

任意删插图:

顺序表查找接口:
int SLFind(SL* ps, SLDateType x)
{assert(ps);int i = 0;for (i = 0; i < ps->size; i++){if (x == ps->arr[i]){printf("%d找到了:",x);return i;}}printf("没有找到\n");return -1;
}

顺序表修改接口:
void SLModify(SL* ps, int pos, SLDateType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size - 1);ps->arr[pos] = x;printf("修改成功\n");
}
修改插图:

3.全部接口代码实现:
#include"SeqList.h"void SLCheckCapacity(SL* ps)
{assert(ps);if (ps->capacity == ps->size){//小问题:刚开始的时候,sl->capacity是0值int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDateType* temp = realloc(ps->arr,sizeof(SLDateType)*newcapacity);if (!temp){perror("realloc fail!");return;}ps->arr = temp;ps->capacity = newcapacity;}
}void SLInit(SL* ps)
{assert(ps);ps->arr = NULL;ps->capacity = ps->size = 0;
}void SLDestroy(SL* ps)
{assert(ps);if (ps->arr){free(ps->arr);}ps->arr = NULL;ps->capacity = ps->size = 0;
}void SLPrint(SL* ps)
{assert(ps);int i = 0;for (i = 0; i < ps->size; i++){printf("%d ", *(ps->arr + i));//ps->arr[i];}printf("\n");
}void SLPushBack(SL* ps,SLDateType x)
{assert(ps);//1.空间不足需要扩大容量//2.空间足够直接放入数据SLCheckCapacity(ps);ps->arr[ps->size] = x;ps->size++;
}void SLPushFront(SL* ps, SLDateType x)
{assert(ps);SLCheckCapacity(ps);//挪动数据int i = 0;for (i = ps->size - 1; i >= 0; i--){ps->arr[i+1] = ps->arr[i];}//放入数据*(ps->arr) = x;ps->size++;
}void SLPopBack(SL* ps)
{assert(ps);assert(ps->size);ps->size--;
}void SLPopFront(SL* ps)
{assert(ps);assert(ps->size);int i = 0;for (i = 1; i < ps->size; i++){ps->arr[i-1] = ps->arr[i];}ps->size--;
}void SLInsert(SL* ps, int pos, SLDateType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);int i = 0;for (i = ps->size - 1; i >= pos; i--){ps->arr[i+1] = ps->arr[i];}ps->arr[pos] = x;ps->size++;
}void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);int i = 0;for (i = pos + 1; i < ps->size; i++){ps->arr[i-1] = ps->arr[i];}ps->size--;
}int SLFind(SL* ps, SLDateType x)
{assert(ps);int i = 0;for (i = 0; i < ps->size; i++){if (x == ps->arr[i]){printf("%d找到了:",x);return i;}}printf("没有找到\n");return -1;
}void SLModify(SL* ps, int pos, SLDateType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size - 1);ps->arr[pos] = x;printf("修改成功\n");
}
完。
相关文章:
【C项目】顺序表
简介:本系列博客为C项目系列内容,通过代码来具体实现某个经典简单项目 适宜人群:已大体了解C语法同学 作者留言:本博客相关内容如需转载请注明出处,本人学疏才浅,难免存在些许错误,望留言指正 作…...
【Docker】在Windows下使用Docker Desktop创建nginx容器并访问默认网站
欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《Docker容器》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对…...
详讲api网关之kong的基本概念及安装和使用(二)
consul的服务注册与发现 如果不知道consul的使用,可以点击上方链接,这是我写的关于consul的一篇文档。 upstreamconsul实现负载均衡 我们知道,配置upstream可以实现负载均衡,而consul实现了服务注册与发现,那么接下来…...
取消Vscode在输入符号时自动补全
取消Vscode在输入符号时自动补全 取消Vscode在输入符号时自动补全问题演示解决方法 取消Vscode在输入符号时自动补全 问题演示 在此状态下输入/会直接自动补全, 如下图 笔者想要达到的效果为可以正常输入/而不进行补全, 如下图 解决方法 在设置->文本编辑器->建议, 取消…...
ElementUI Form:Input 输入框
ElementUI安装与使用指南 Input 输入框 点击下载learnelementuispringboot项目源码 效果图 el-input.vue 页面效果图 项目里el-input.vue代码 <script> export default {name: el_input,data() {return {input: ,input1: ,input2: ,input3: ,input4: ,textarea: …...
Vue_Router_守卫
路由守卫:路由进行权限控制。 分为:全局守卫,独享守卫,组件内守卫。 全局守卫 //创建并暴露 路由器 const routernew Vrouter({mode:"hash"//"hash路径出现#但是兼容性强,history没有#兼容性差"…...
GDB调试技巧实战--自动化画出类关系图
1. 前言 上节我们在帖子《Modern C++利用工具快速理解std::tuple的实现原理》根据GDB的ptype命令快速的理解了std::tuple数据结构的实现,但是手动一个个打印,然后手动画出的UML图,这个过程明显可以自动化。 本文旨在写一个GDB python脚本把这个过程自动化。 本脚本也可以用…...
python使用Schedule
目录 一:使用场景: 二:参数 三:实例 "Schedule"在Python中通常指的是时间调度或任务计划。Python中有多个库可以用来处理时间调度和任务计划,其中最流行的是schedule库。 一&#x…...
Linux系列之查看cpu、内存、磁盘使用情况
查看磁盘空间 df命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。使用df -h命令,加个-h参数是为了显示GB MB KB单位,这样更容易查看 Filesystem …...
【C语言】socket编程接收问题
一、recv()函数接收到的返回值为0表示对端已经关闭 在TCP套接字编程中,通过recv()函数接收到的返回值为0通常表示对端已经关闭了套接字的发送部分。这是因为TCP是一个基于连接的协议,其中有定义明确的连接建立和终止流程;当对端调用close()或…...
Python与ArcGIS系列(二十)GDAL之合并shp和geojson要素图层
目录 0 简述1 代码实现2 结果展示0 简述 Shp格式是GIS中非常重要的数据格式,主要在Arcgis中使用,但在进行很多基于网页的空间数据可视化时,通常只接受GeoJSON格式的数据,众所周知JSON是利用键值对+嵌套来表示数据的一种格式,以其轻量、易解析的优点,被广泛使用与各种领域…...
CGAL5.4.1 边塌陷算法
目录 1、使用曲面网格的示例 2、使用默认多面体的示例 3、使用丰富多面体的示例 主要对1、使用曲面网格的示例 进行深度研究 CGAL编译与安装CGAL安装到验证到深入_cgal测试代码-CSDN博客 参考资料CGAL 5.4.5 - Triangulated Surface Mesh Simplification: User Manual …...
网络安全知识和华为防火墙
网络安全 网络空间安全 ---Cyberspace 2003年美国提出的网络空间概念 ---一个由信息基础设施组成的互相依赖的网络。 我国官方文件定义:网络空间为继海、陆、空、天以外的第五大人类互动领域。 通信保密阶段 --- 计算机安全阶段 --- 信息系统安全 --- 网络空间安…...
Docker 搭建MySQL主从复制-读写分离
一. 介绍 MySQL主从复制是一种常用的数据库高可用性解决方案,通过在主数据库上记录的数据变更,同步到一个或多个从数据库,实现数据的冗余备份和读写分离。在Docker环境下搭建MySQL主从复制和读写分离,不仅方便管理,还…...
[linux] which和find有什么区别?
which 和 find 都是 Unix/Linux 系统中的命令,但它们的用途和工作方式有很大的不同。 which 命令:which 命令是用来查找并显示用户可以在当前环境下执行的命令的完整路径。这些命令通常位于 PATH 环境变量中指定的目录中。例如,which python …...
使用Neo4j做技术血缘管理
目录 一、neo4j介绍 二、windows安装启动neo4j 2.1下载neo4j 2.2 解压文件 2.3 启动neo4j 三、neo4j基础操作 3.1 创建结点和关系 3.2 查询 3.3 更改 3.4 删除 四、技术血缘Demo实现 4.1 构建节点对象 4.2 构建存储对象 4.3 创建有属性关联关系 4.4 最后是图结果…...
Unity-WebGL
问题:提示gzip压缩报错解决:关闭打包的地方压缩,如下图问题:窗口未全屏解决:使用百分比画布替换固定尺寸画布 参考:新版Unity打包Webgl端进行屏幕自适应_unity webgl分辨率自适应-CSDN博客问题:…...
腾讯云部署vue+node项目
文章目录 一、安装宝塔二、vue项目部署三、node项目部署 前言: 关于项目部署,一开始也是找了很多资料,费了点时间,所以记录一下。希望能对各位有所帮助。 一、安装宝塔 1.首先在控制台,进入云服务器的终端界面 2.输入命令和密码获取权限,并且安装宝塔界面 yum install -y w…...
HBase表结构
HBase是非关系型数据库,是高可靠性、高性能、面向列、可伸缩、实时读写的分布式数据库。 HBase使用场景 大规模数据存储:如日志记录、数据库备份等。实时数据访问:如实时搜索、实时分析等。高性能读写:如高并发、低延迟的读写操…...
本人面试积累面试题更新中
本人面试积累面试题 1.事务的隔离级别 答:2024年1月30日 1.读已提交-----读取其他事务已经提交的数据 2.读未提交-----读取其他事务还未提交的数据–可能出现脏读 3.可重复读-----同一个事务多次读取同一个数据,尽可能的保证数据的一致性但是可能出现幻读 4.串行读------确保每…...
【紧急预警】DeepSeek v2.3.1已确认存在默认策略绕过漏洞——立即核查你的access_control.yaml配置(附热补丁)
更多请点击: https://intelliparadigm.com 第一章:DeepSeek访问控制配置 DeepSeek模型服务在企业级部署中需严格遵循最小权限原则,访问控制配置是保障API调用安全与资源隔离的核心环节。DeepSeek官方SDK及OpenAPI网关均支持基于Token的细粒度…...
百度网盘macOS客户端逆向工程深度解析:Method Swizzling技术实现与应用
百度网盘macOS客户端逆向工程深度解析:Method Swizzling技术实现与应用 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 百度网盘SVIP破解插…...
如何通过html-to-docx实现HTML到Word文档的精准转换:技术架构与最佳实践深度解析
如何通过html-to-docx实现HTML到Word文档的精准转换:技术架构与最佳实践深度解析 【免费下载链接】html-to-docx HTML to DOCX converter 项目地址: https://gitcode.com/gh_mirrors/ht/html-to-docx 在数字化办公和企业文档处理流程中,HTML到Wor…...
构建企业级离线词典服务:ECDICT高性能架构设计与毫秒级查询优化
构建企业级离线词典服务:ECDICT高性能架构设计与毫秒级查询优化 【免费下载链接】ECDICT Free English to Chinese Dictionary Database 项目地址: https://gitcode.com/gh_mirrors/ec/ECDICT ECDICT是一个拥有150万词汇量的开源中英文词典数据库,…...
别再乱装WinPcap了!手把手教你为华为eNSP Cloud正确配置虚拟网卡(Win7/Win10兼容方案)
华为eNSP Cloud虚拟网卡配置全指南:从原理到避坑实践 当你第一次打开华为eNSP Cloud功能时,是否也遇到过网卡显示不全的困扰?这个问题困扰过无数网络学习者和备考者,而90%的根源都指向同一个错误——WinPcap的安装方式。本文将彻底…...
告别网课低效循环:这款开源工具如何让学习时间减半
告别网课低效循环:这款开源工具如何让学习时间减半 【免费下载链接】mooc-assistant 慕课助手 浏览器插件(Chrome/Firefox/Opera) 项目地址: https://gitcode.com/gh_mirrors/mo/mooc-assistant 你是否曾在深夜对着电脑屏幕,一遍遍重复着相同的手…...
免费开源AMD Ryzen调试工具:5步快速掌握SMUDebugTool处理器控制技巧
免费开源AMD Ryzen调试工具:5步快速掌握SMUDebugTool处理器控制技巧 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址…...
3分钟掌握中国车牌生成器:从零构建车牌图像数据集
3分钟掌握中国车牌生成器:从零构建车牌图像数据集 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 你是否曾为车牌识别项目缺乏训练数据而苦恼?…...
从零开始将Taotoken接入静态网站实现动态AI交互
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 从零开始将Taotoken接入静态网站实现动态AI交互 1. 场景与核心思路 对于使用 Hugo、Hexo、VuePress 等工具生成的静态网站&#x…...
在多轮对话应用中感受Taotoken提供的高稳定性与低延迟
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在多轮对话应用中感受Taotoken提供的高稳定性与低延迟 开发一个需要维持上下文的多轮对话应用,对后端服务的稳定性和响…...
