顺序表<数据结构 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/872066.shtml

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

相关文章

基于jeecgboot-vue3的Flowable流程同时支持bpmn流程设计器与仿钉钉流程设计器(全网首创)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、新建流程的时候可以选择使用不同的流程设计器 2、选择bpmn流程设计器 3、选择仿钉钉流程设计器

EMQX开源版安装

一、EMQX是什么 EMQX 是一款开源的大规模分布式 MQTT 消息服务器&#xff0c;功能丰富&#xff0c;专为物联网和实时通信应用而设计。EMQX 5.0 单集群支持 MQTT 并发连接数高达 1 亿条&#xff0c;单服务器的传输与处理吞吐量可达每秒百万级 MQTT 消息&#xff0c;同时保证毫秒…

深入剖析 Scikit-learn 中的 LogisticRegression:参数调优指南

Logistic Regression 是一种广泛应用于二分类问题的机器学习算法。在 scikit-learn 库中&#xff0c;LogisticRegression 类提供了一个高效且易于使用的实现。本文将深入探讨 LogisticRegression 的各种参数&#xff0c;并展示如何通过调整这些参数来优化模型的性能。 1. Logi…

UDP-如何实现客户端与服务器端的通信(一对一、一对多、多对一、多对多之间的通信)

Java中提供了DatagramSocket来实现这个功能 1.服务器端的程序 创建Socket&#xff0c;监听6666端口读取来自客户端的“数据包”,创建数据包(通过DatagramPacket实现数据包的创建)接收数据包从数据包中&#xff0c;读取数据(通过recieve()接收数据和send()发送给数据) 代码如下…

线程安全(六)AQS 的工作原理

目录 一、AQS 概述1.1 什么是 AQS?1.2 AQS 与 synchronized 区别:1.3 AQS 常见的实现类:二、AQS 的工作原理2.1 state 的用途:2.2 AQS 双向链表:2.3 ConditionObject 双向队列:2.4 总结:画图说明三、AQS 资源同步3.1 AQS 资源同步方式3.2 自定义同步器3.3 常见同步工具类…

追踪微服务脉络:Eureka中实现分布式链路追踪的精妙之道

追踪微服务脉络&#xff1a;Eureka中实现分布式链路追踪的精妙之道 在微服务架构的复杂网络中&#xff0c;服务间的调用关系错综复杂&#xff0c;一个请求可能经过多个服务节点。分布式链路追踪技术能够帮助我们清晰地看到请求在系统中的流转路径&#xff0c;对于性能监控、故…

顶顶通呼叫中心中间件-被叫路由、目的地绑定(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-被叫路由、目的地绑定(mod_cti基于FreeSWITCH) 1、配置分机 点击分机 -> 找到你需要设置的分机 ->呼叫路由设置为external 2、配置拨号方案 点击拨号方案 -> 输入目的地绑定 -> 点击添加 -> 点击brother conditi ->根据图中配置 co…

基于深度学习的文本摘要

基于深度学习的文本摘要技术利用深度学习模型从大量文本中提取关键信息&#xff0c;并生成简洁的摘要。这项技术在新闻摘要、文档概要、研究报告、法律文件等领域有广泛应用。以下是对这一领域的系统介绍&#xff1a; 1. 任务和目标 文本摘要的主要任务和目标包括&#xff1a…

【实战系列】PostgreSQL 专栏,基于 PostgreSQL 16 版本

我的 PostgreSQL 专栏介绍及进度 20240715&#xff1a;目前整体进度已完成 85%&#xff0c;完成 16 万字&#xff0c;还有近 5 万字就截稿了。 (venv312) ➜ mypostgres git:(dev) sh scripts/word_statistics_pg_style.sh Filename …

JDK、JRE、JVM

JDK、JVM、JRE&#xff1f; JDK&#xff08;Java Development Kit&#xff09; JDK是JRE加上额外的开发工具和资源的集合&#xff0c;它包含了JRE的全部内容。JDK中包括了编译器&#xff08;如javac&#xff0c;用于将源代码编译成字节码&#xff09;、调试器、文档生成工具、…

无人机航电系统技术详解

一、系统概述 无人机航电系统&#xff08;Avionics System&#xff09;是无人机飞行与任务执行的核心部分&#xff0c;它集成了飞控系统、传感器、导航设备、通信设备等&#xff0c;为无人机提供了必要的飞行控制和任务执行能力。航电系统的设计和性能直接影响到无人机的安全性…

爬虫技术探索:Node.js 的优势与实践

在大数据时代&#xff0c;数据挖掘与分析成为了企业和研究机构的重要工作之一。而网络爬虫作为获取公开网络数据的关键工具&#xff0c;其重要性不言而喻。在众多编程语言中&#xff0c;Node.js 因其异步非阻塞I/O模型、丰富的第三方库支持以及与现代Web技术的紧密集成&#xf…

pygame在get_rect()函数

在处理 rect 对象时&#xff0c;可以使用矩形的四个角及中心的 x 坐标和 y 坐标&#xff0c;通过设置这些值来指定矩形的位置。以下是一些常用的属性和它们的用途&#xff1a; 中心对齐&#xff1a; center&#xff1a;设置矩形的中心点。 centerx&#xff1a;设置矩形中心的…

【JVM基础03】——组成-详细介绍下Java中的堆

目录 1- 引言&#xff1a;堆1-1 堆是什么&#xff1f;(What)1-2 为什么用堆&#xff1f;堆的作用 (Why) 2- ⭐核心&#xff1a;堆的原理&#xff08;How&#xff09;2-1 堆的划分2-2 Java 7 与 Java 8 的堆区别 3- 小结&#xff1a;3-1 详细介绍下Java的堆&#xff1f;3-2 JVM …

概率论原理精解【1】

文章目录 测度概述集类笛卡尔积定义例子 多集合的笛卡尔积定义计算方法注意事项 有限笛卡尔积的性质1. 定义2. 性质2.1 基数性质2.2 空集性质2.3 不满足交换律2.4 不满足结合律2.5 对并和交运算满足分配律 3. 示例4. 结论 参考链接 测度 概述 所谓测度&#xff0c;通俗的讲就…

基于springboot与vue的旅游推荐系统与门票售卖

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

如何在 C# 中实现高效的内存管理,避免内存泄漏和提高性能?

在C#中实现高效的内存管理和提高性能可以采取以下几个方法&#xff1a; 使用对象池&#xff1a;对象池是一种重复使用对象的技术&#xff0c;可以减少内存分配和释放的开销。可以使用 ObjectPool 类或者自定义一个简单的对象池来管理对象的创建和回收。 及时释放资源&#xff…

iPhone数据恢复:如何从iPhone恢复误删除的短信

来自iPhone的意外删除的短信可能很关键。它们可能是来自您常用应用程序、银行交易、付款收据的重要通知&#xff0c;也可能是来自朋友的重要文本、孩子的学校通知等。 如果您也从iPhone丢失了此类消息&#xff0c;我们在这里分享如何在没有备份以及有备份的情况下在iPhone上恢…

SQL Server详细使用教程(包含启动SQL server服务、建立数据库、建表的详细操作) 非常适合初学者

SQL Server详细使用教程(包含启动SQL server服务、建立数据库、建表的详细操作) 非常适合初学者 文章目录 目录 前言 一、启动SQL server服务的三种方法 1.不启动SQL server服务的影响 2.方法一&#xff1a;利用cmd启动SQL server服务 3.方法二&#xff1a;利用SQL Serv…

人工智能算法工程师(中级)课程14-神经网络的优化与设计之拟合问题及优化与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程14-神经网络的优化与设计之拟合问题及优化与代码详解。在机器学习和深度学习领域&#xff0c;模型的训练目标是找到一组参数&#xff0c;使得模型能够从训练数据中学习到有用的模式&am…