顺序表的实现(C语言)

本文章主要对顺序表的介绍以及数据结构的定义,以及几道相关例题,帮助大家更好理解顺序表.

文章目录

前言

一、顺序表的静态实现

二、顺序表的动态实现

三.定义打印顺序表函数

四.定义动态增加顺序表长度函数

五.创建顺序表并初始化

六.顺序表的按位查找

七.顺序表的按值查找

八.顺序表删除第i个元素

九.在第i个元素前插入e

十.从顺序表中删除最小元素,其空出的位置用最后一个元素填补

十一.在无序顺序表中删除值在s和t之间的元素

十二.所有代码及运行结果

总结


前言

顺序表,如果对顺序表的知识点没有了解,建议先学完一定的基础知识再来学习.

由于本人没有太多时间编写介绍顺序表的知识,请谅解.


一、顺序表的静态实现

typedef int Elemtype;
typedef struct Sqlist {
Elemtype qlist[Maxsize];//静态分配数组
int length;//元素个数
}Sqlist;

顺序表的静态实现就是我们常说的数组,我们定义了一个结构题来封装,结构体中记录数据,以及元素长度.

二、顺序表的动态实现

typedef int ElemType;
typedef struct Sqlist {Elemtype* qlist;//dataint length;//元素个数int maxsize;//可存储最大元素个数
};

顺序表的动态实现,就是定义一个指针,指向一个数组,这里动态分配是指,你可以使用malloc函数自己申请空间,结构体中记录了数据去qlist,元素长度lengeh,最大元素个数maxsize

三.定义打印顺序表函数

//定义打印顺序表函数
void print(Sqlist L) {for (int i = 0; i < L.length; i++) {//顺序遍历顺序表printf("%d ", L.qlist[i]);}printf("\n顺序表长度为:%d\n", L.length);printf("总大小为:%d\n", L.maxsize);
}

就是一个简单的for loop,注意数组下表从零开始.

四.定义动态增加顺序表长度函数

//定义动态增加数组长度函数
void Increasesize(Sqlist &L,int len) {Elemtype* p = L.qlist;L.qlist = (Elemtype*)malloc(sizeof(Elemtype) * (L.maxsize + len));//动态增加数组长度assert(L.qlist);for (int i = 0; i < L.length; i++) {//复制原表信息L.qlist[i] = p[i];//提示可能会越界,可忽略}free(p);p = NULL;L.maxsize = L.maxsize + len;//总大小发生改变
}

重新申请一片更大的内存,别忘了改变顺序表的总大小.

五.创建顺序表并初始化

//例1:定义创建顺序表并初始化函数
void InitSqlist(Sqlist &L) {//初始化空间为20,长度为10,{ 0,1,2,3,4,5,6,7,8,9 }L.maxsize = Max;L.length = 10;int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };L.qlist = (Elemtype*)malloc(sizeof(Elemtype) * (L.maxsize));for (int i = 0; i < L.length; i++) {L.qlist[i] = arr[i];}
}

六.顺序表的按位查找

//定义顺序表的按位查找函数
Elemtype GetElem(Sqlist L, int i) {if (i<0 || i>L.length - 1) {//判断是否越界printf("查找失败!\n");return false;}return L.qlist[i-1];
}

七.顺序表的按值查找

//定义顺序表的按值查找函数
int findElem(Sqlist L,Elemtype e) {for (int i = 0; i < L.length; i++){if (L.qlist[i] == e) return i + 1;//返回第几个元素}printf("查找失败!\n");return -1;
}

八.顺序表删除第i个元素

//例2:从顺序表删除第i个元素
void deleteElem(Sqlist& L, int i,Elemtype &e) {if (i<0 || i>L.length) {//判断是否越界printf("删除失败!\n");return;}e = L.qlist[i - 1];for (int j = i; j < L.length; j++) {L.qlist[j - 1] = L.qlist[j];}L.length--;
}

注意:顺序表删除元素或者插入元素为保证元素的有序性,必须移动元素.

九.在第i个元素前插入e

//例3:在第i个元素前插入e
void insert(Sqlist& L, int i, Elemtype e) {if (i<=L.length && i>0 && L.length<L.maxsize){for (int j = L.length - 1; j >= i - 1; j--) {L.qlist[j + 1] = L.qlist[j];}L.qlist[i - 1] = e;L.length++;printf("true\n");}else printf("false\n");
}

十.从顺序表中删除最小元素,其空出的位置用最后一个元素填补

//例4:从顺序表中删除最小元素,其空出的位置用最后一个元素填补
void deleteMin(Sqlist &L,Elemtype &e) {int min = 0;for (int i = 1; i < L.length ; i++) {if (L.qlist[i] < L.qlist[min]) {min = i;}}e = L.qlist[min];L.qlist[min] = L.qlist[L.length - 1];L.length--;
}

十一.在无序顺序表中删除值在s和t之间的元素

//例5:在无序顺序表中删除值在s和t之间的元素
void deletest(Sqlist &L, int s, int t) {int curlength = 0;for (int i = 0; i < L.length;i++) {if (L.qlist[i] <= s || L.qlist[i] >= t) {L.qlist[curlength++] = L.qlist[i];}}L.length = curlength;
}

这个只需用本身的数组就可以原地完成,

十二.所有代码及运行结果

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<malloc.h>
#include<assert.h>
#define Max 20
//顺序表的静态分配
typedef int Elemtype;
//typedef struct Sqlist {
//	Elemtype qlist[Maxsize];//静态分配数组
//	int length;//元素个数
//}Sqlist;//顺序表的动态分配
typedef struct Sqlist {Elemtype* qlist;int length;int maxsize;
};
//定义打印顺序表函数
void print(Sqlist L) {for (int i = 0; i < L.length; i++) {//顺序遍历顺序表printf("%d ", L.qlist[i]);}printf("\n顺序表长度为:%d\n", L.length);printf("总大小为:%d\n", L.maxsize);
}
//定义动态增加数组长度函数
void Increasesize(Sqlist &L,int len) {Elemtype* p = L.qlist;L.qlist = (Elemtype*)malloc(sizeof(Elemtype) * (L.maxsize + len));//动态增加数组长度assert(L.qlist);for (int i = 0; i < L.length; i++) {//复制原表信息L.qlist[i] = p[i];//提示可能会越界,可忽略}free(p);p = NULL;L.maxsize = L.maxsize + len;//总大小发生改变
}
//例1:定义创建顺序表并初始化函数
void InitSqlist(Sqlist &L) {//初始化空间为20,长度为10,{ 0,1,2,3,4,5,6,7,8,9 }L.maxsize = Max;L.length = 10;int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };L.qlist = (Elemtype*)malloc(sizeof(Elemtype) * (L.maxsize));for (int i = 0; i < L.length; i++) {L.qlist[i] = arr[i];}
}
//定义顺序表的按位查找函数
Elemtype GetElem(Sqlist L, int i) {if (i<0 || i>L.length - 1) {//判断是否越界printf("查找失败!\n");return false;}return L.qlist[i-1];
}
//定义顺序表的按值查找函数
int findElem(Sqlist L,Elemtype e) {for (int i = 0; i < L.length; i++){if (L.qlist[i] == e) return i + 1;//返回第几个元素}printf("查找失败!\n");
}
//例2:从顺序表删除第i个元素
void deleteElem(Sqlist& L, int i,Elemtype &e) {if (i<0 || i>L.length) {//判断是否越界printf("删除失败!\n");return;}e = L.qlist[i - 1];for (int j = i; j < L.length; j++) {L.qlist[j - 1] = L.qlist[j];}L.length--;
}
//例3:在第i个元素前插入e
void insert(Sqlist& L, int i, Elemtype e) {if (i<=L.length && i>0 && L.length<L.maxsize){for (int j = L.length - 1; j >= i - 1; j--) {L.qlist[j + 1] = L.qlist[j];}L.qlist[i - 1] = e;L.length++;printf("true\n");}else printf("false\n");
}
//例4:从顺序表中删除最小元素,其空出的位置用最后一个元素填补
void deleteMin(Sqlist &L,Elemtype &e) {int min = 0;for (int i = 1; i < L.length ; i++) {if (L.qlist[i] < L.qlist[min]) {min = i;}}e = L.qlist[min];L.qlist[min] = L.qlist[L.length - 1];L.length--;
}
//例5:在无序顺序表中删除值在s和t之间的元素
void deletest(Sqlist &L, int s, int t) {int curlength = 0;for (int i = 0; i < L.length;i++) {if (L.qlist[i] <= s || L.qlist[i] >= t) {L.qlist[curlength++] = L.qlist[i];}}L.length = curlength;
}
int main() {printf("+++++++++++++++++++++++++++++++++++++++\n");printf("对Increasesize进行测试!\n");Sqlist L;InitSqlist(L);print(L);//打印顺序表以及信息Increasesize(L, 10);//增加数组总大小print(L);printf("+++++++++++++++++++++++++++++++++++++++\n");printf("对按位查找函数GetElem进行测试!\n");int  a = GetElem(L, 5);//寻找第5个元素printf("a的值为:%d\n",a);printf("+++++++++++++++++++++++++++++++++++++++\n");printf("对按值查找函数findElem进行测试!\n");int b = findElem(L, 9);//寻找元素9printf("b的值为:%d\n", b);printf("+++++++++++++++++++++++++++++++++++++++\n");printf("对deleteElem进行测试!\n");int e = 0;deleteElem(L, 5, e);printf("e的值为:%d\n", e);print(L);InitSqlist(L);//初始化printf("+++++++++++++++++++++++++++++++++++++++\n");printf("对insert进行测试!\n");insert(L, 5, 66);print(L);InitSqlist(L);//初始化printf("+++++++++++++++++++++++++++++++++++++++\n");printf("对deleteMin进行测试!\n");int c = 0;deleteMin(L, c);printf("最小值c的值为:%d\n",c);print(L);InitSqlist(L);//初始化printf("+++++++++++++++++++++++++++++++++++++++\n");printf("对deletest进行测试!\n");deletest(L, 3, 8);print(L);return 0;}

结果:


总结

大家一定要动手试一试,这有助于更好的理解数据结构,而且顺序表本身不是很难,文章中代码有些语句属于辅助作用,帮助大家理解,在答卷是可以去掉,代码记住思路,不要死机硬背,我相信如果实践了,考试时会得心应手,后续整个数据结构都会给大家介绍,包括树和图的大题,都帮助大家实现.如果有问题的话,在评论区我会帮助大家解答.

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

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

相关文章

如何下载 GOES(Geostationary Operational Environmental Satellite)卫星数据

GOES是指地球静止轨道卫星&#xff08;Geostationary Operational Environmental Satellite&#xff09;系统&#xff0c;它是美国国家海洋和大气管理局&#xff08;NOAA&#xff09;和美国国家航空航天局&#xff08;NASA&#xff09;合作开发和运营的一系列气象卫星。这些卫星…

如何编写高效的正则表达式?

正则表达式&#xff08;Regular Expression&#xff0c;简称regex&#xff09;是一种强大的文本处理技术&#xff0c;广泛应用于各种编程语言和工具中。本文将从多个方面介绍正则表达式的原理、应用和实践&#xff0c;帮助你掌握这一关键技术。 正则可视化 | 一个覆盖广泛主题…

19、Kubernetes核心技术 - 资源限制

目录 一、概述 二、Kubernetes 中的资源单位 2.1、CPU资源单位 2.2、内存资源单位 三、Pod资源限制 四、namespace资源限制 4.1、为命名空间配置内存和 CPU 配额 4.2、为命名空间配置默认的内存请求和限制 4.3、为命名空间配置默认的CPU请求和限制 五、超过容器限制的…

240107-RHEL8+RHEL9配置安装:NVIDIA驱动(15步)+CUDA(4步)+CUDNN(5步)+GPU压力测试

Section 0: 基础知识 CUDA、cuDNN 和 PyTorch 版本的选择与搭配指南 安装优先级: 显卡驱动 → CUDA → CUDA Toolkit → cuDNN → Pytorch 即显卡驱动决定了CUDA版本&#xff0c;CUDA版本决定了CUDA Toolkit、cuDNN、Pytorch各自的版本提前下载 &#xff5c; CUDA提前下载 &am…

超自动化助力企业财务转型升级

在快节奏的财务规划与分析环境中&#xff0c;传统的预算方法虽长期以来一直是企业制定有效决策的支柱&#xff0c;但已不足以驾驭当今复杂的商业环境。不断的经济变化、市场的不确定性以及利益相关者的需求增加促使企业寻求更敏捷的解决方案。如今&#xff0c;部分企业开始尝试…

lc 140. 单词拆分 II

回溯算法查询匹配单词 class Solution { public:unordered_map<string, int> word_map;void mapping(vector<string>& wordDict){for(auto &a : wordDict)word_map[a];}vector<string> ret;// s: 原始字符串// tmp: 已查询到的单词// …

CSS 彩虹按钮效果

<template><view class"content"><button class"btn">彩虹按钮</button></view> </template><script></script><style>body{background-color: #000;}.content {margin-top: 300px;}.btn {width: 1…

Debian12使用Xshell连接失败解决办法详细

1、Debian开启ssh服务 sudo apt update -y sudo apt install ssh2、编辑配置文件 # 安装vim sudo apt install vimvim /etc/ssh/sshd_config3、将#PermitRootLogin prohibit-password的注释去掉&#xff0c;设置为yes 4、将#PasswordAuthentication no的注释去掉&#xff0c;…

JAVA------IO流复制总结

IO流复制文件 方法一 字符 注意点&#xff1a;写和读需要保持一致的编码形式。 public class eee {public static void main(String[] args) {FileInputStream in null;FileOutputStream out null;OutputStreamWriter outw null;InputStreamReader inr null;try{out new …

VX小程序Burp抓包

方法有很多&#xff0c;工具也各有差异&#xff0c;主要是学代理流量的思路 Burp流量代理工具小程序 一、Burp证书导入 1、开启代理 开启浏览器的代理&#xff0c;火狐推荐FoxyProxy&#xff0c;Google推荐SwitchyOmega&#xff0c;设置代理为127.0.0.1:8080。 2、下载证书…

Apache Doris (六十三): Spark Doris Connector - (3)-配置型及列映射关系

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. Spark 操作Doris配置项…

2023量子科技十大人物(团队) | 光子盒年度系列

今年&#xff0c;是量子科学与技术的又一个丰收年&#xff0c;学术研究团体和科技公司纷纷庆祝在量子计算、量子通信和量子计量学以及基础量子科学方面取得的重大成就。面对如此多令人兴奋的进展&#xff0c;我们不能不为这些进展庆祝——而所有这些的一切&#xff0c;都离不开…

深入了解static关键字的作用和应用--java面向对象学习

Static修饰成员变量 Static是什么 叫静态&#xff0c;可以修饰成员变量&#xff0c;成员方法 成员变量按有无static修饰分俩种&#xff1a; 类变量&#xff1a;有static修饰&#xff0c;属于类&#xff0c;在计算机里只有一份&#xff0c;会被类的全部对…

ssm基于Vue.js的网上招聘系统设计与实现+vue论文

摘 要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已经有了很丰富的基础&#xff0c;并且在现实生活中也到处都在使用&#xff0c;可以说&#xff0c;经过几十年的发展&#xff0c;互联网技术已经把地域信息的隔阂给消除了&#xff0c;让整个世界都可以即时通话…

Qt6入门教程 4:Qt Creator常用技巧

在上一篇Qt6入门教程 3&#xff1a;创建Hello World项目中&#xff0c;通过创建一个Qt项目&#xff0c;对Qt Creator已经有了比较直观的认识&#xff0c;本文将介绍它的一些常用技巧。 Qt Creator启动后默认显示欢迎页面 创建项目已经用过了&#xff0c;打开项目也很简单&#…

漫漫数学之旅002

文章目录 一、经典格言二、数学习题三、古今评注四、科学家小传 - 开普勒开普勒第一定律(椭圆轨道定律)开普勒第二定律(面积定律)开普勒第三定律(调和定律)一、经典格言 自然追求尽可能的简单。——约翰尼斯开普勒(Johannes Kepler) 二、数学习题 假定你只有容量为3夸…

【HDFS】一次备NameNode宕机过久导致的生产事故

一次备NameNode宕机过久导致的生产事故 故障描述 最近发生的一个临时故障&#xff0c;情况是一个启了HA的HDFS集群&#xff0c;在2023年9月份因为两台NameNode同时启动产生一些问题&#xff0c;所以当时将一台节点停止&#xff0c;一直没有启动&#xff0c;具体为什么当时有问…

高效的图纸管理技巧、高效的图纸管理软件

高效的图纸管理技巧包括以下几个方面&#xff1a; 分类和组织&#xff1a;首先&#xff0c;确保你有一种清晰的图纸分类和组织系统。创建不同的文件夹来储存不同类型的图纸&#xff0c;如建筑、机械、电气等。更细的分类还可以按项目或客户进行划分。命名规则&#xff1a;为图…

QT:单例

单例的定义 官方定义&#xff1a;单例是指确保一个类在任何情况下都绝对只有一个实例&#xff0c;并提供一个全局访问点。 单例的写法 抓住3点&#xff1a; 构造函数私有化&#xff08;确保只有一个实例&#xff09;提供一个可以获取构造实例的接口&#xff08;提供唯一的实…

03.分支结构

分支结构 应用场景 迄今为止&#xff0c;我们写的Python代码都是一条一条语句顺序执行&#xff0c;这种代码结构通常称之为顺序结构。然而仅有顺序结构并不能解决所有的问题&#xff0c;比如我们设计一个游戏&#xff0c;游戏第一关的通关条件是玩家获得1000分&#xff0c;那…