【C语言数据结构】线性表-顺序存储-动态分配(顺序表)


线性表-顺序存储-动态分配

  • 代码实现


代码实现

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>//线性表初始分配的长度
#define InitSize 3//线性表元素的数据类型
#define ElemType inttypedef struct {//定义线性表的元素数据,虽然是指针,实际上物理内存也是连续出存储的ElemType *data;//MaxSize是当前线性表的最大长度,这个数值也有可能改变,因为后续操作中线性表有可能扩容,因为是动态分配。//length是线性表的当前长度,也就是实际上里面有多少个数据int MaxSize, length;
} SeqList;//函数声明
bool Empty(SeqList list);//初始化线性表,也就是创建一个新的线性表。
void InitList(SeqList *list) {list->data = (ElemType *) malloc(InitSize * sizeof(ElemType));list->MaxSize = InitSize;list->length = 0;
}//扩容线性表
bool MultipleList(SeqList *list) {//建立临时线性表,用于存储之前的数据元素
//    SeqList listNew;
//    InitList(&listNew);
//    for (int i = 0; i < list->length; i++) {
//        listNew.data[i] = list->data[i];
//    }
//    listNew.length = list->length;
//
//    list->data = (ElemType *) malloc(list->MaxSize * sizeof(ElemType) * 2);
//    for (int i = 0; i < listNew.length; i++) {
//        list->data[i] = listNew.data[i];
//    }
//    list->MaxSize = list->MaxSize * 2;//上面是我之前写的愚蠢的代码if(list->data != NULL){list->data = (ElemType *) realloc(list->data, list->MaxSize * sizeof(ElemType) * 2);//如果新内存分配成功,也就是list->data不为空,就把MaxSize设置为原来的两倍list->MaxSize = list->MaxSize * 2;return true;}printf("扩容失败!\n");return false;
}//返回线性表表长
int Length(SeqList list) {return list.length;
}//添加数据元素
void AddElem(SeqList *list, ElemType Elem) {//如果当前线性表已满,就进行内存重新分配if (list->length == list->MaxSize) {if(!MultipleList(list)){printf("扩容失败,线性表已被销毁!\n");return;}}list->data[list->length] = Elem;list->length++;
}//按值查找操作
int LocateElem(SeqList list, ElemType Elem) {if (Empty(list)) {//线性表为空,则查找失败return -1;}for (int i = 0; i < list.length; i++) {if (list.data[i] == Elem)return i;}return -1;
}//按位查找操作
bool GetElem(SeqList list, int index, ElemType *Elem) {if (index >= 0 && index < list.length) {*Elem = list.data[index];return true;}printf("获取失败!\n");return false;
}//插入操作
bool ListInsert(SeqList *list, int index, ElemType Elem) {//如果线性表已满,就先进行扩容if (list->length == list->MaxSize) {MultipleList(list);}//判断输入的数组下标是否在合法范围内if (index >= 0 && index < list->length) {for (int i = list->length - 2; i >= index; i--) {list->data[i + 1] = list->data[i];}list->data[index] = Elem;list->length++;return true;}return false;
}//删除元素
bool ListDelete(SeqList *list, int index) {if (index >= 0 && index < list->length) {for (int i = index; i < list->length - 1; i++) {list->data[i] = list->data[i+1];}list->length--;return true;}return false;
}//销毁线性表
void DestroyList(SeqList *list){//如果list->data依然被分配内存,那么进行释放if(list->data != NULL) {//释放之前分配的内存free(list->data);//避免悬空指针问题,直接把list->data指针设置为空list->data = NULL;}list->length = 0;list->MaxSize = 0;
}//打印整个线性表
void PrintList(SeqList list) {if (Empty(list)) {printf("线性表为空!\n");return;}for (int i = 0; i < list.length; i++) {printf("%d -> %d\n", i, list.data[i]);}
}//线性表判空,如果线性表为空,返回true。不为空返回false
bool Empty(SeqList list) {if (list.length == 0)return true;return false;
}int main() {//定义线性表aSeqList a;//定义数据元素ElemType Elem;//定义数组下标和菜单选择int index, choice;//初始化线性表aInitList(&a);while (1) {printf("\n菜单\n""1.查看线性表\n""2.获取线性表长度\n""3.添加线性表元素\n""4.按值查找操作\n""5.按位查找操作\n""6.插入操作\n""7.删除操作\n""8.销毁线性表\n""9.退出程序\n""10.获取线性表最大长度(测试)\n""请输入你要进行的操作:");scanf("%d", &choice);switch (choice) {case 1:PrintList(a);break;case 2:printf("当前线性表长度为%d\n", Length(a));break;case 3:printf("请输入要添加的数据数值:");scanf("%d", &Elem);AddElem(&a, Elem);break;case 4:printf("请输入要查找的数据元素值:");scanf("%d", &Elem);index = LocateElem(a, Elem);if (index == -1) {printf("元素查找失败!\n");break;} else {printf("元素%d对应的数组下标为%d\n", Elem, index);break;}case 5:printf("请输入要查找的数据元素的数组下标:");scanf("%d", &index);if (GetElem(a, index, &Elem)) {printf("数组下标为%d的元素为%d\n", index, Elem);break;} else {printf("查找失败!\n");break;}case 6:printf("请输入要插入的元素的位置(数组下标):");scanf("%d", &index);printf("请输入要插入的元素的数据值:");scanf("%d", &Elem);if (ListInsert(&a, index, Elem)) {printf("插入成功!\n");break;} else {printf("插入失败!输入的数组下标不合法\n");break;}case 7:printf("请输入要删除的元素的数组下标:");scanf("%d",&index);if(ListDelete(&a,index)){printf("元素删除成功!\n");break;}else{printf("元素删除失败!输入的下标不合法\n");break;}case 8:DestroyList(&a);break;case 9:exit(0);case 10:printf("当前线性表最大长度为%d\n",a.MaxSize);break;default:printf("输入的操作有误,请重新输入!\n");break;}}
}

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

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

相关文章

玩客云Armbian_23.08.0-trunk_Onecloud_bookworm_edge_6.4.14.burn配置

固定IP # interface file auto-generated by buildrootauto lo iface lo inet loopback// 上面是默认的内容,下面是新增的内容,上下之间需要一个空行隔开 // 接口顶格写,属性的前面有一个tab的缩进 # The primary network interfaceauto eth0 iface eth0 inet staticaddress 1…

【QT】自定义组件ui类添加到主ui界面方法

1.添加自定义组件到项目中 add new选择如下 写好类方法&#xff0c;确定即可 2.将新创建的ui类加入到主ui界面 选中新创建ui类的父类空块&#xff0c;右键选择提升为 选择并添加新创建的类

如何搭建团队知识库?试试新的工具和方法吧!

知识本身没有价值&#xff0c;只有被利用的知识才能发挥作用。我们经常见到有许多“宏伟”的团队知识库&#xff0c;但是从来没有人去用…… 搭建团队知识库 没有人用的团队知识库存在的问题是“我们知道所有问题的答案&#xff0c;就是不知道问题是什么”。如何建立团队知识库…

业务拆分——微服务拆分独立出来的步骤

背景介绍 随着公司业务的变化&#xff0c;系统的架构需要不断的调整。当客户的需求不断细化&#xff0c;营销方案的不断调整&#xff0c;产品需要达到更细的粒度&#xff0c;以便产品可以灵活组合进行销售。故此时需要拆分一些公共的业务&#xff0c;作为独立的微服务部署&…

NLP中token总结

Token 可以被理解为文本中的最小单位。在英文中&#xff0c;一个 token 可以是一个单词&#xff0c;也可以是一个标点符号。在中文中&#xff0c;通常以字或词作为 token。ChatGPT 将输入文本拆分成一个个 token&#xff0c;使模型能够对其进行处理和理解 在自然语言处理&#…

vertx的学习总结2

一、什么是verticle verticle是vertx的基本单元&#xff0c;其作用就是封装用于处理事件的技术功能单元 &#xff08;如果不能理解&#xff0c;到后面的实战就可以理解了&#xff09; 二、写一个verticle 1. 引入依赖&#xff08;这里用的是gradle&#xff0c;不会吧&#…

flink生成水位线记录方式--周期性水位线生成器

背景 在flink基于事件的时间处理中&#xff0c;水位线记录的生成是一个很重要的环节&#xff0c;本文就来记录下几种水位线记录的生成方式的其中一种&#xff1a;周期性水位线生成器 周期性水位线生成器 1.1 BoundedOutOfOrdernessTimeStampExtractor 他会接收一个表示最大延…

【C语言 模拟实现strlen函数的三种方法】

C语言程序设计笔记---022 C语言之模拟实现strlen函数1、介绍strlen函数2、模拟strlen函数的三种方法2.1、计数器法模拟实现strlen函数2.2、递归法模拟实现strlen函数2.3、指针减指针法模拟实现strlen函数 3、结语 C语言之模拟实现strlen函数 前言&#xff1a; 通过C语言字符串…

18scala笔记

Scala2.12 视频地址 1 入门 1.1 发展历史 … 1.2 Scala 和 Java Scala Java 编写代码使用scalac编译成.class字节码文件scala .class文件 执行代码 1.3 特点 1.4 安装 视频地址 注意配置好环境变量 简单代码 1.5 编译文件 编译scala文件会产生两个.class文件 使用java…

【初始Linux】上

初始Linux上 一、Linux背景1.1 UNIX发展的历史1.2 UNIX发展的历史 二、开源三、官网Linux官网 四、企业应用现状五、发行版本六、 os概念&#xff0c;定位 本博客简介 初始Linux操作系统初识shell命令 ,了解若干背景知识。使用常用Linux命令了解Linux权限概念与思想,能深度理解…

Java | Maven(知识点查询)

文章目录 Maven知识速查1. Maven概述2. Maven的作用3. Maven的下载4. Maven的环境配置5. Maven 的基础组成5.1 Maven仓库5.1.1 本地仓库配置&#xff1a;5.1.2 中央仓库配置&#xff1a;5.1.3 镜像仓库配置 5.2 Maven坐标 6. Maven项目6.1 手工创建Maven项目6.2 自动构建项目 7…

安卓 kuaishou 设备did和egid 学习分析

did和egid注册 接口 https://gdfp.ksapisrv.com/rest/infra/gdfp/report/kuaishou/android did 是本地生成的16进制 或者 获取的 android_id public static final Random f16237a new Random(System.currentTimeMillis()); public static long m19668a() { return f1623…

GraphQL全面深度讲解

目录 一、GraphQL 是什么 二、GraphQL 规范 数据模型 字段 参数 三、运行示例 四、优势和劣势 优势 劣势 一、GraphQL 是什么 GraphQL 是一种用于 API 的查询语言&#xff0c;也是一个基于服务端的运行引擎。 GraphQL 提供了一套完整的规范和描述用于查询 API&#xf…

【图像处理】【应用程序设计】加载,编辑和保存图像数据、图像分割、色度键控研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

WebGL笔记:绘制矩形面的几种方式以及封装封装多边形对象来绘制不同图形

绘制矩形面 可以绘制的面只有三角面&#xff0c;要绘制矩形面的话&#xff0c;只能用两个三角形去拼 1 &#xff09; 使用 三角带 TRIANGLE_STRIP 绘制矩形 回顾一下之前的规律&#xff1a; 第一个三角形&#xff1a;v0>v1>v2第偶数个三角形&#xff1a;以上一个三角形…

在移动固态硬盘上安装Ubuntu系统和ROS2

目录 原视频准备烧录 原视频 b站鱼香ros 准备 1.在某宝上买一个usb移动固态硬盘或固态U盘&#xff0c;至少64G 2.下载鱼香ros烧录工具 下载第二个就行了&#xff0c;不然某网盘的速度下载全部要一天 下载后&#xff0c;选择FishROS2OS制作工具压缩包&#xff0c;进行解压…

【分布式微服务】feign 异步调用获取不到ServletRequestAttributes

公司调用接口的时候使用feign,但是服务之间还是使用了鉴权,需要通过RequestInterceptor 去传递uuid 概念 OpenFeign是一个声明式的Web服务客户端,它使得编写HTTP客户端变得更简单。在使用OpenFeign进行异步调用时,你可以通过配置来实现。但是,如果你在配置或调用过程中遇…

【vue3】toRef与toRefs的使用,toRef与ref的区别

假期第四篇&#xff0c;对于基础的知识点&#xff0c;我感觉自己还是很薄弱的。 趁着假期&#xff0c;再去复习一遍 1、toRef与toRefs 创建一个ref对象&#xff0c;其value值指向另一个对象中的某个属性 语法&#xff1a;const name toRef&#xff08;person,‘name’&#xf…

(四)动态阈值分割

文章目录 一、基本概念二、实例解析 一、基本概念 基于局部阈值分割的dyn_threshold()算子&#xff0c;适用于一些无法用单一灰度进行分割的情况&#xff0c;如背景比较复杂&#xff0c;有的部分比前景目标亮&#xff0c;或者有的部分比前景目标暗&#xff1b;又比如前景目标包…

【postgresql 基础入门】多表联合查询 join与union 并,交,差等集合操作,两者的区别之处

多表数据联合查询 ​专栏内容&#xff1a; postgresql内核源码分析手写数据库toadb并发编程 ​开源贡献&#xff1a; toadb开源库 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#x…