【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.xdnf.cn/news/146430.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

imgui开发笔记<1>、ubuntu环境下快速应用

去这个链接下载imgui源码&#xff08;在此之前需要安装opengl glfw3等等&#xff09;&#xff1a; sudo apt-get install libglfw3-dev https://github.com/ocornut/imgui 我这里源码下载到/home/temp/imgui目录下&#xff0c;咱们不需要编译源码成库&#xff0c;而是直接将下…

【Axure高保真原型】3D圆柱图_中继器版

今天和大家分享3D圆柱图_中继器版的原型模板&#xff0c;图表在中继器表格里填写具体的数据&#xff0c;调整坐标系后&#xff0c;就可以根据表格数据自动生成对应高度的圆柱图&#xff0c;鼠标移入时&#xff0c;可以查看对应圆柱体的数据……具体效果可以打开下方原型地址体验…

网络安全渗透测试工具之skipfish

网络安全渗透测试工具skipfish介绍 在数字化的时代,Web 应用程序安全成为了首要任务。想象一下,您是一位勇敢的安全冒险家,迎接着那些隐藏在 Web 应用程序中的未知风险。而在这个冒险之旅中,您需要一款强大的工具来帮助您发现漏洞,揭示弱点。而这个工具就是 Skipfish。 …

LeetCode 周赛上分之旅 #48 一道简单的树上动态规划问题

⭐️ 本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架&#xff0c;你的思考越抽象&#xff0c;它能覆盖的问题域就越广&#xff0c;理解难度…

点击、拖拉拽,BI系统让业务掌握数据分析主动权

在今天的商业环境中&#xff0c;数据分析已经成为企业获取竞争优势的关键因素之一。然而&#xff0c;许多企业在面对复杂的数据分析工具时&#xff0c;却常常感到困扰。这些工具往往需要专业的技术人员操作&#xff0c;而且界面复杂&#xff0c;难以理解和使用。对业务人员来说…

阿里云 Oss 权限控制

前言 最近公司的私有 Oss 服务满了&#xff0c;且 Oss 地址需要设置权限&#xff0c;只有当前系统的登录用户才能访问 Oss 下载地址。一开始想着用 Nginx 做个转发来着&#xff0c;Nginx 每当检测当前请求包含特定的 Oss 地址就转发到我们的统一鉴权接口上去&#xff0c;但是紧…

picoctf_2018_shellcode

picoctf_2018_shellcode Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX disabled PIE: No PIE (0x8048000) RWX: Has RWX segments32位&#xff0c;啥都没开 这个看着挺大的&#xff0c;直接来个ROPchain&#xff0c;…

Redis缓存穿透、击穿和雪崩

面试高频 服务的高可用问题&#xff01; 在这里我们不会详细的区分析解决方案的底层&#xff01; Redis缓存概念 Redis缓存的使用&#xff0c;极大的提升了应用程序的性能和效率&#xff0c;特别是数据查询方面。但同时&#xff0c;它也带来了一些问题。其中&#xff0c;最要…

Android stdio的Gradle菜单栏无内容问题的解决方法

右边Gradle菜单栏里没有Tasks选项内容的问题 正常情况↓ 如果这个问题如果无法解决的话&#xff0c;Gradle打包就只能通过控制台输入命令来解决&#xff0c;但这无疑是把简单问题复杂化了&#xff0c;我们来看看怎么解决这个问题吧。 这里有几个方法提供&#xff0c;可以自行选…

排序篇(四)----归并排序

排序篇(四)----归并排序 1.归并(递归) 基本思想&#xff1a; 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andConquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到…

leetCode 376.摆动序列 动态规划 + 图解 + 状态转移

376. 摆动序列 - 力扣&#xff08;LeetCode&#xff09; 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如…

微信小程序引入字体在部分机型失效不兼容解决办法

写小程序页面&#xff0c;美工作图用了特殊字体 引入代码&#xff1a; font-face {font-family: huxiaobo;src: url("https://xxxxxxxx.top/assets/fonts/huxiaobonanshenti.woff") } .font-loaded {font-family: "huxiaobo"; } 上线后发现部分安卓机型不…

209. 长度最小的子数组(滑动窗口)

一、题目 209. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int left 0, right 0;int sum nums[right];int MinLength INT_MAX;while (left <nums.siz…

计算机竞赛 深度学习火车票识别系统

文章目录 0 前言1 课题意义课题难点&#xff1a; 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 图像识别 火车票识别系统 该项目较为新颖&#xff0c;适…

54、数组--模拟

LCR 146. 螺旋遍历二维数组 给定一个二维数组 array&#xff0c;请返回「螺旋遍历」该数组的结果。 螺旋遍历&#xff1a;从左上角开始&#xff0c;按照 向右、向下、向左、向上 的顺序 依次 提取元素&#xff0c;然后再进入内部一层重复相同的步骤&#xff0c;直到提取完所有…

(vue3)create-vue 组合式APIsetup、ref、watch,通信

优势&#xff1a; 更易维护&#xff1a;组合式api&#xff0c;更好的TS支持 之前是选项式api&#xff0c;现在是组合式&#xff0c;把同功能的api集合式管理 复用功能封装成一整个函数 更快的速度 更小的体积 更优的数据响应式&#xff1a;Proxy create-vue 新的脚手架工…

【VIM】VIm-plug插件

如何查找需要的插件 https://github.com/mhinz/vim-startify https://github.com/vim-airline/vim-airline https://github.com/Yggdroot/indentLine github.com/w0ng/vim-hybrid github.com/altercationi/vim-colors-solarized guithub.com/morhetz/gruvbox github.com/sc…

PHP8的静态变量和方法-PHP8知识详解

我们在上一课程讲到了public、private、protected这3个关键字&#xff0c;今天我们来讲解static关键字&#xff0c;明天再讲解final关键字。 如果不想通过创建对象来调用变量或方法&#xff0c;则可以将该变量或方法创建为静态变量或方法&#xff0c;也就是在变量或方法的前面…

什么是博弈论?

什么是博弈&#xff1f;字面描述中&#xff0c;博弈由两个字构成&#xff1a;博 和 弈。博弈是一种双方&#xff08;多方&#xff09;的对抗&#xff08;比赛&#xff09;&#xff0c;对抗总是在一定的规则下进行&#xff0c;参与者必然会考虑应用相应的策略&#xff08;计谋&a…

YOLOv5-PTQ量化部署

目录 前言一、PTQ量化浅析二、YOLOv5模型训练1. 项目的克隆和必要的环境依赖1.1 项目克隆1.2 项目代码结构整体介绍1.3 环境安装 2. 数据集和预训练权重的准备2.1 数据集2.2 预训练权重准备 3. 训练模型3.1 修改数据配置文件3.2 修改模型配置文件3.3 训练模型3.4 mAP测试 三、Y…