顺序表<数据结构 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,一经查实,立即删除!

相关文章

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…

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

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

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

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;无所不包…

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

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

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控件目前已经升级…

电脑屏幕录制怎么弄?分享3个简单的电脑录屏方法

在信息爆炸的时代&#xff0c;屏幕上的每一个画面都可能成为我们生活中不可或缺的记忆。作为一名年轻男性&#xff0c;我对于录屏软件的需求可以说是既挑剔又实际。今天&#xff0c;我就为大家分享一下我近期体验的三款录屏软件&#xff1a;福昕录屏大师、转转大师录屏大师和OB…

高频面试题-CSS

BFC 介绍下BFC (块级格式化上下文) 1>什么是BFC BFC即块级格式化上下文&#xff0c;是CSS可视化渲染的一部分, 它是一块独立的渲染区域&#xff0c;只有属于同一个BFC的元素才会互相影响&#xff0c;且不会影响其它外部元素。 2>如何创建BFC 根元素&#xff0c;即HTM…

maven项目容器化运行之2-maven中使用docker插件调用远程docker构建服务并在1Panel中运行

一.背景 公司主机管理小组的同事期望我们开发的maven项目能够在1Panel管理的docker容器部署。上一篇写了先开放1Panel中docker镜像构建能力maven项目容器化运行之1-基于1Panel软件将docker镜像构建能力分享给局域网-CSDN博客。这一篇就是演示maven工程的镜像构建、容器运行、运…

昇思25天学习打卡营第14天|DCGAN 与漫画头像生成:原理剖析与训练实战

目录 数据集下载 数据处理 构建生成器 构建判别器 模型训练 结果展示 数据集下载 首先尝试卸载已安装的 mindspore 库&#xff0c;然后通过指定的镜像源安装特定版本&#xff08;2.2.14&#xff09;的 mindspore 库。从指定的 URL 下载一个 zip 文件到当前目录下的 ./faces…

SMTP服务器地址与端口号有哪些关系与区别?

SMTP服务器地址如何正确配置&#xff1f;怎么验证服务器的地址&#xff1f; 了解SMTP服务器地址与端口号的关系与区别对于确保邮件系统的正常运作至关重要。AokSend将详细探讨这两者之间的关系和区别&#xff0c;并解释它们在邮件传输过程中的重要性。 SMTP服务器地址&#x…

吴恩达深度学习笔记:机器学习策略(2)(ML Strategy (2)) 2.9-2.10

目录 第三门课 结构化机器学习项目&#xff08;Structuring Machine Learning Projects&#xff09;第二周&#xff1a;机器学习策略&#xff08;2&#xff09;(ML Strategy (2))2.9 什么是端到端的深度学习&#xff1f;&#xff08;What is end-to-end deep learning?&#x…

spring是如何解决循环依赖的,为什么不是两级

1. Spring使用三级缓存来解决循环依赖问题 Spring使用三级缓存来解决循环依赖问题&#xff0c;‌而不是使用两级缓存。‌ 在Spring框架中&#xff0c;‌解决循环依赖的关键在于正确地管理Bean的生命周期和依赖关系。‌循环依赖指的是两个或多个Bean相互依赖&#xff0c;‌如果…