当前位置: 首页 > news >正文

【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项目】顺序表

简介&#xff1a;本系列博客为C项目系列内容&#xff0c;通过代码来具体实现某个经典简单项目 适宜人群&#xff1a;已大体了解C语法同学 作者留言&#xff1a;本博客相关内容如需转载请注明出处&#xff0c;本人学疏才浅&#xff0c;难免存在些许错误&#xff0c;望留言指正 作…...

【Docker】在Windows下使用Docker Desktop创建nginx容器并访问默认网站

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…...

详讲api网关之kong的基本概念及安装和使用(二)

consul的服务注册与发现 如果不知道consul的使用&#xff0c;可以点击上方链接&#xff0c;这是我写的关于consul的一篇文档。 upstreamconsul实现负载均衡 我们知道&#xff0c;配置upstream可以实现负载均衡&#xff0c;而consul实现了服务注册与发现&#xff0c;那么接下来…...

取消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_守卫

路由守卫&#xff1a;路由进行权限控制。 分为&#xff1a;全局守卫&#xff0c;独享守卫&#xff0c;组件内守卫。 全局守卫 //创建并暴露 路由器 const routernew Vrouter({mode:"hash"//"hash路径出现#但是兼容性强&#xff0c;history没有#兼容性差"…...

GDB调试技巧实战--自动化画出类关系图

1. 前言 上节我们在帖子《Modern C++利用工具快速理解std::tuple的实现原理》根据GDB的ptype命令快速的理解了std::tuple数据结构的实现,但是手动一个个打印,然后手动画出的UML图,这个过程明显可以自动化。 本文旨在写一个GDB python脚本把这个过程自动化。 本脚本也可以用…...

python使用Schedule

目录 一&#xff1a;使用场景&#xff1a; 二&#xff1a;参数 三&#xff1a;实例 "Schedule"在Python中通常指的是时间调度或任务计划。Python中有多个库可以用来处理时间调度和任务计划&#xff0c;其中最流行的是schedule库。 一&#x…...

Linux系列之查看cpu、内存、磁盘使用情况

查看磁盘空间 df命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间&#xff0c;目前还剩下多少空间等信息。使用df -h命令&#xff0c;加个-h参数是为了显示GB MB KB单位&#xff0c;这样更容易查看 Filesystem …...

【C语言】socket编程接收问题

一、recv()函数接收到的返回值为0表示对端已经关闭 在TCP套接字编程中&#xff0c;通过recv()函数接收到的返回值为0通常表示对端已经关闭了套接字的发送部分。这是因为TCP是一个基于连接的协议&#xff0c;其中有定义明确的连接建立和终止流程&#xff1b;当对端调用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年美国提出的网络空间概念 ---一个由信息基础设施组成的互相依赖的网络。 我国官方文件定义&#xff1a;网络空间为继海、陆、空、天以外的第五大人类互动领域。 通信保密阶段 --- 计算机安全阶段 --- 信息系统安全 --- 网络空间安…...

Docker 搭建MySQL主从复制-读写分离

一. 介绍 MySQL主从复制是一种常用的数据库高可用性解决方案&#xff0c;通过在主数据库上记录的数据变更&#xff0c;同步到一个或多个从数据库&#xff0c;实现数据的冗余备份和读写分离。在Docker环境下搭建MySQL主从复制和读写分离&#xff0c;不仅方便管理&#xff0c;还…...

[linux] which和find有什么区别?

which 和 find 都是 Unix/Linux 系统中的命令&#xff0c;但它们的用途和工作方式有很大的不同。 which 命令&#xff1a;which 命令是用来查找并显示用户可以在当前环境下执行的命令的完整路径。这些命令通常位于 PATH 环境变量中指定的目录中。例如&#xff0c;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

问题&#xff1a;提示gzip压缩报错解决&#xff1a;关闭打包的地方压缩&#xff0c;如下图问题&#xff1a;窗口未全屏解决&#xff1a;使用百分比画布替换固定尺寸画布 参考&#xff1a;新版Unity打包Webgl端进行屏幕自适应_unity webgl分辨率自适应-CSDN博客问题&#xff1a;…...

腾讯云部署vue+node项目

文章目录 一、安装宝塔二、vue项目部署三、node项目部署 前言: 关于项目部署,一开始也是找了很多资料,费了点时间,所以记录一下。希望能对各位有所帮助。 一、安装宝塔 1.首先在控制台,进入云服务器的终端界面 2.输入命令和密码获取权限,并且安装宝塔界面 yum install -y w…...

HBase表结构

HBase是非关系型数据库&#xff0c;是高可靠性、高性能、面向列、可伸缩、实时读写的分布式数据库。 HBase使用场景 大规模数据存储&#xff1a;如日志记录、数据库备份等。实时数据访问&#xff1a;如实时搜索、实时分析等。高性能读写&#xff1a;如高并发、低延迟的读写操…...

本人面试积累面试题更新中

本人面试积累面试题 1.事务的隔离级别 答:2024年1月30日 1.读已提交-----读取其他事务已经提交的数据 2.读未提交-----读取其他事务还未提交的数据–可能出现脏读 3.可重复读-----同一个事务多次读取同一个数据,尽可能的保证数据的一致性但是可能出现幻读 4.串行读------确保每…...

告别繁琐配置:用快马AI一键生成企业级gstack项目脚手架,效率提升300%

最近在帮公司搭建一个内部任务管理后台&#xff0c;技术选型上我们决定采用gstack&#xff08;Next.js 14 TypeScript Tailwind CSS Prisma NextAuth&#xff09;。本以为是个简单的初始化工作&#xff0c;结果光是配置各种工具和依赖就花了大半天时间。直到发现了InsCode(…...

忍者像素绘卷一文详解:Z-Image-Turbo加速模型+Masashi Kishimoto风格注入

忍者像素绘卷一文详解&#xff1a;Z-Image-Turbo加速模型Masashi Kishimoto风格注入 1. 创作理念与技术亮点 忍者像素绘卷是一款革命性的图像生成工具&#xff0c;它将传统忍者漫画的热血精神与现代AI技术完美结合。这款工具基于Z-Image-Turbo深度优化&#xff0c;专为16-Bit…...

nginx——方向代理和负载均衡

目录 1.1 Nginx概述 1.1.1 企业青睐 Nginx 的核心原因 1.1.2 Nginx的作用 1.3 反向代理和负载均衡 1.4 注 1.4.1 代理百度并使用 18090 端口 1.1 Nginx概述 1.1.1 企业青睐 Nginx 的核心原因 Nginx 由俄罗斯开发者打造&#xff0c;具有超高稳定性&#xff08;资源占用极低…...

如何高效使用FFmpegGUI:面向新手的完整视频处理工具指南

如何高效使用FFmpegGUI&#xff1a;面向新手的完整视频处理工具指南 【免费下载链接】ffmpegGUI ffmpeg GUI 项目地址: https://gitcode.com/gh_mirrors/ff/ffmpegGUI FFmpegGUI是一款让零基础用户也能轻松掌握专业视频处理的跨平台图形界面工具。这款基于Electron和Rea…...

Photon光影包:颠覆级Minecraft视觉体验的沉浸式渲染方案

Photon光影包&#xff1a;颠覆级Minecraft视觉体验的沉浸式渲染方案 【免费下载链接】photon A gameplay-focused shader pack for Minecraft 项目地址: https://gitcode.com/gh_mirrors/photon3/photon 在像素化的方块世界中&#xff0c;如何突破视觉边界实现电影级画面…...

基于CIEDE2000标准的AI图像分层技术:从像素聚类到设计效率革命

基于CIEDE2000标准的AI图像分层技术&#xff1a;从像素聚类到设计效率革命 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 在数字设计领域&#xff0c;将…...

Sammy.js项目实战:从零搭建完整的单页应用架构终极指南

Sammy.js项目实战&#xff1a;从零搭建完整的单页应用架构终极指南 【免费下载链接】sammy Sammy is a tiny javascript framework built on top of jQuery, Its RESTful Evented Javascript. 项目地址: https://gitcode.com/gh_mirrors/sa/sammy Sammy.js是一个轻量级的…...

Pixel Couplet Gen实操手册:微信小程序分包加载优化像素春联H5首屏速度

Pixel Couplet Gen实操手册&#xff1a;微信小程序分包加载优化像素春联H5首屏速度 1. 项目背景与核心价值 Pixel Couplet Gen是一款融合传统春节文化与现代像素艺术风格的创新应用。通过ModelScope大模型的文本生成能力&#xff0c;结合精心设计的8-bit视觉元素&#xff0c;…...

seo 站群的优缺点是什么

SEO 站群的优缺点解析 在现代的互联网营销中&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;站群是一个重要的概念。SEO 站群是指由多个主题相关的网站组成的集合&#xff0c;这些网站通过某种联系形式运作在一起&#xff0c;以提升整体的搜索引擎排名和流量。虽然 SEO …...

电商网站SEO网站结构应该如何设计

电商网站SEO网站结构设计的关键点 在当今数字化时代&#xff0c;电商网站的成功离不开搜索引擎优化&#xff08;SEO&#xff09;。一个精心设计的网站结构不仅能提升网站的用户体验&#xff0c;还能大大提高在搜索引擎上的排名。电商网站SEO网站结构应该如何设计呢&#xff1f…...