顺序表<数据结构 C版>

目录

线性表

顺序表

动态顺序表类型

初始化

 销毁

打印

检查空间是否充足(扩容)

尾部插入

头部插入

尾部删除

头部删除

指定位置插入

指定位置删除

查找数据


线性表

        线性表是n个相同特性的数据元素组成的有限序列,其是一种广泛运用的数据结构,常见的线性表有顺序表、栈、链表、队列等。

        其在逻辑上是线性的,物理结构(存储结构)上不一定是线性的。


顺序表

        顺序表就是线性表的一种,它在逻辑结构与物理结构上都是连续的,一般情况下它的底层就是数组,在数组基础上多了增删查改操作。

顺序表有静态顺序表和动态顺序表,我们常常采用动态顺序表,因为它的扩容方便、空间浪费更少。


动态顺序表类型
typedef int SeqDataType;//将动态顺表的存储数据的类型重命名,方便后期统一修改//动态顺序表
typedef struct SeqList {//命名:Sequence List顺序表SeqDataType* arr;int capacity;//动态顺序表的容量int size;//动态顺序表的有效个数
}SL;

初始化
//初始化
void SLInit(SL* s) {s->arr = NULL;s->capacity = s->size = 0;
}

 销毁
//销毁
void SLDestory(SL* s) {if (!s->arr) {//等同于s->arr==NULL,判断要释放的空间是否是NULL,防止释放NULLperror("Destory Fail");//打印错误exit(1);}free(s->arr);//释放动态开辟的内存s->arr = NULL;s->capacity = s->size = 0;
}

打印

打印操作方便我们检查错误。

//打印
void SLPrint(SL* s) {assert(s);for (int i = 0; i < s->size; i++) {printf("%d ", s->arr[i]);}printf("\n");
}

检查空间是否充足(扩容)

插入操作会扩大空间大小,那么在进行插入操作前,我们应该检查空间是否充足(扩容)

//检查空间是否充足(扩容)
void SLCheckCapacity(SL* s) {if (s->capacity == s->size) {//判断有效元素个数是否和空间大小相同,相同:空间用满了,要扩容int newcapacity = s->capacity == 0 ? 4 : s->capacity * 2;//空间是否为0,是:赋个初值4(防止按倍数扩容出错)//不是:按两倍扩容,赋给临时变量,防止扩容失败对原capacity改变SeqDataType* p = (SeqDataType*)realloc(s->arr, sizeof(SeqDataType) *newcapacity);//这里是为s->arr扩容,不是为结构体(动态顺序表)if (!p) {perror("realloc fail");exit(1);}s->arr = p;s->capacity = newcapacity;}
}

尾部插入
//尾插
void SLPushBack(SL* s, SeqDataType x) {assert(s);SLCheckCapacity(s);//检查空间是否充足s->arr[s->size++] = x;//尾部插入数据,并使有效元素加1
}

头部插入
//头插
void SLPushFront(SL* s, SeqDataType x) {assert(s);//SLCheckCapacity(s);for (int i = s->size ; i > 0; i--) {s->arr[i] = s->arr[i-1];}//将数据整体后移一位,腾出第一位给头插,且循环条件初始化i等于s->sizes->arr[0] = x;s->size++;//别忘了将有效数据个数加一
}

尾部删除
//尾删
void SLPopBack(SL* s) {assert(s->arr);//不能对空数组进行删除assert(s->size);//不能对有效元素0个的数组进行删除s->size--;//直接使有效元素个数减1即可
}

头部删除
//头删
void SLPopFront(SL* s) {assert(s->arr);assert(s->size);for (int i = 0; i < s->size - 1; i++) {s->arr[i] = s->arr[i + 1];}//注意循环条件s->size-1,取到最后一个元素前一个位置s->size--;
}

指定位置插入
//指定位置之前插入数据
void SLInsert(SL* s, int pos, SeqDataType x) {assert(s);assert(pos >= 0 && pos <= s->size);//pos=0时头插,pos=s->size时尾插,SLCheckCapacity(s);for (int i = s->size; i >pos; i++) {//从pos位置开始腾出位置给要插入的数据s->arr[i] = s->arr[i - 1];}s->size++;s->arr[pos] = x;
}

指定位置删除
//指定位置删除
void SLErase(SL* s, int pos) {assert(s->arr);assert(pos >= 0 && pos < s->size);//保证pos是可删除的for (int i = pos; i < s->size - 1; i++) {//使pos以后的数据向前移一位s->arr[i] = s->arr[i + 1];}s->size--;
}

查找数据
//查找数据
void SLFind(SL* s, SeqDataType x) {assert(s->arr);assert(s->size > 0);for (int i = 0; i < s->size; i++) {//遍历顺序表,找到值返回下标,找不到,返回-1if (s->arr[i] == x) {return i;}}return -1;
}

最后我们来测试一下我们写的代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/873385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决警告Creating a tensor from a list of numpy.ndarrays is extremely slow.

我的问题是创建一个列表x[]&#xff0c;然后不断读入数据使用x.append(sample)&#xff0c;chatgpt说这样转化比较低效&#xff0c;如果预先知道样本个数&#xff0c;可以用numpy来创建数组&#xff0c;再用索引x[i]sample赋值第二种方法更快&#xff0c;直接用numpy转化一下np…

04 Git与远程仓库

第4章&#xff1a;Git与远程仓库 一、Gitee介绍及创建仓库 一&#xff09;获取远程仓库 ​ 使用在线的代码托管平台&#xff0c;如Gitee&#xff08;码云&#xff09;、GitHub等 ​ 自行搭建Git代码托管平台&#xff0c;如GitLab 二&#xff09;Gitee创建仓库 ​ gitee官…

Gitee使用教程2-克隆仓库(下载项目)并推送更新项目

一、下载 Gitee 仓库 1、点击克隆-复制代码 2、打开Git Bash 并输入复制的代码 下载好后&#xff0c;找不到文件在哪的可以输入 pwd 找到仓库路径 二、推送更新 Gitee 项目 1、打开 Git Bash 用 cd 命令进入你的仓库&#xff08;我的仓库名为book&#xff09; 2、添加文件到 …

Spring-Boot基础--yaml

目录 Spring-Boot配置文件 注意&#xff1a; YAML简介 YAML基础语法 YAML:数据格式 YAML文件读取配置内容 逐个注入 批量注入 ConfigurationProperties 和value的区别 Spring-Boot配置文件 Spring-Boot中不用编写.xml文件&#xff0c;但是spring-Boot中还是存在.prope…

【Qt+opencv】基础的图像绘制

文章目录 前言line函数ellipse函数rectangle函数circle函数fillPoly函数putText函数总结 前言 在计算机视觉和图像处理领域&#xff0c;OpenCV是一个强大的库&#xff0c;提供了丰富的功能和算法。而Qt是一个跨平台的C图形用户界面应用程序开发框架&#xff0c;它为开发者提供…

参与开源项目 MySQL 的心得体会

前言 开源项目的数量和种类都在急剧增长&#xff0c;涵盖了从操作系统、数据库到人工智能、区块链等几乎所有的技术领域。这为技术的快速创新和迭代提供了强大的动力&#xff0c;使得新技术能够更快地普及和应用. 目录 经历 提升 挑战 良好的编程习惯 总结 经历 参与开源…

微信小程序-实现跳转链接并拼接参数(URL拼接路径参数)

第一种常用拼接方法&#xff1a;普通传值的拼接 //普通传值的拼接checkRouteBinttap: function (e) {wx.navigateTo({url: ../checkRoute/checkRoute?classId this.data.classInfo.classId "&taskId" this.data.classInfo.taskId,})}第二种&#xff1a;拼接…

Linux Namespace

Linux namespaces 介绍 namespaces是Linux内核用来隔离内核资源的方式。通过namespaces可以让一些进程只能看到与自己相关的那部分资源。而其它的进程也只能看到与他们自己相关的资源。这两拨进程根本感知不到对方的存在。而它具体的实现细节是通过Linux namespaces来实现的。 …

(三)C++之运算符重载

一.概念 C准许以运算符命名函数&#xff01;&#xff01;&#xff01; string a “hello”; a “ world”;// (a, “world”); cout<<“hello”; // <<(cout, “hello”); 可重载的运算符 不可重载的运算符 二.成员函数式(第一个行参是对象的引用) class T…

orcad导出pdf 缺少title block

在OrCAD中导出PDF时没有Title Block 最后确认问题在这里&#xff1a; 要勾选上Title Block Visible下面的print

k8s学习笔记——dashboard安装

重装了k8s集群后&#xff0c;重新安装k8s的仪表板&#xff0c;发现与以前安装不一样的地方。主要是镜像下载的问题&#xff0c;由于网络安全以及国外网站封锁的原因&#xff0c;现在很多镜像按照官方提供的仓库地址都下拉不下来&#xff0c;导致安装失败。我查了好几天&#xf…

Nginx详解(超级详细)

目录 Nginx简介 1. 为什么使用Nginx 2. 安装Nginx Nginx的核心功能 1. Nginx反向代理功能 2. Nginx的负载均衡 3 Nginx动静分离 Nginx简介 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;在BSD-like 协…

你能分清工业领域这些常见的技术文档吗?

在制造业领域中&#xff0c;技术文档是不可或缺的宝贵资源。它们不仅是产品设计理念的载体&#xff0c;更是指导生产、保证质量、降低错误的关键。技术文档详尽描述了产品的每一个细节&#xff0c;从设计原理到零部件规格&#xff0c;从装配步骤到操作指南&#xff0c;无所不包…

RabbitMQ 如何保证消息的可靠性

在分布式系统中&#xff0c;消息队列&#xff08;如 RabbitMQ&#xff09;扮演着至关重要的角色&#xff0c;它们作为中间件&#xff0c;帮助系统解耦、异步处理任务、提升系统性能和可靠性。然而&#xff0c;在使用消息队列时&#xff0c;确保消息的可靠性是一个不可忽视的问题…

Java 中快速生成唯一id

&#x1f446;&#x1f3fb;&#x1f446;&#x1f3fb;&#x1f446;&#x1f3fb;关注博主&#xff0c;让你的代码变得更加优雅。 前言 Hutool 是一个小而全的Java工具类库&#xff0c;通过静态方法封装&#xff0c;降低相关API的学习成本&#xff0c;提高工作效率&#xf…

关于dom4j主节点的xmlns无法写入的问题

由于最近需要做一个xml的文件&#xff0c;使用dom4j的时候发现了一个bug&#xff0c;就是我的xmlns根本无法写入到xml的头部标签中。 Element element document.addElement("test"); element.addAttribute("xmlns", "urn:Declaration:datamodel:sta…

使用 tcpdump 进行网络流量捕获与分析

目录 安装 tcpdump基本用法捕获网络流量指定网络接口捕获特定主机的流量捕获特定端口的流量捕获特定协议的流量 常用选项保存捕获的数据包从文件读取数据包显示数据包内容指定捕获数据包的长度限制捕获的数据包数量显示详细信息过滤表达式 示例捕获本地回环接口上的HTTP流量捕获…

Windows10 22H2专业工作站版:功能全新升级,工作更高效!

Windows10 22H2专业工作站版是一款专为具有高级数据需求的人士设计的操作系统&#xff0c;拥有强大的服务器级数据保护和性能&#xff0c;可以帮助用户不断突破高级工作负载的挑战。接下来系统之家小编给大家带来全新升级的Windows10 22H2专业工作站版系统&#xff0c;喜欢的用…

刚起步的家庭海外仓:涉及到的全部业务优化流程

对于家庭海外仓来说&#xff0c;最难的阶段应该就是刚起步的时候。对业务流程不熟悉&#xff0c;也没有客户积累&#xff0c;本身的预算又十分有限。 在这个情况下应该注意什么&#xff0c;怎样才能顺利的开展业务&#xff1f;今天我们就针对这个问题详细的梳理了一下家庭海外…

界面控件DevExpress Blazor UI v24.1 - 发布全新TreeList组件

DevExpress Blazor UI组件使用了C#为Blazor Server和Blazor WebAssembly创建高影响力的用户体验&#xff0c;这个UI自建库提供了一套全面的原生Blazor UI组件&#xff08;包括Pivot Grid、调度程序、图表、数据编辑器和报表等&#xff09;。 DevExpress Blazor控件目前已经升级…