顺序表的实现(上)(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/621813.shtml

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

相关文章

力扣 第 121 场双周赛 解题报告 | 珂学家 | 数位DP

前言 整体评价 T3, T4 都是典题 T1. 大于等于顺序前缀和的最小缺失整数 思路: 模拟 class Solution { public:int missingInteger(vector<int>& nums) {set<int> s(nums.begin(), nums.end());int acc nums[0];for (int i 1; i < nums.size(); i) {if …

Win10专业版系统搭建DNS解析服务

Win10专业版 纯新手&#xff0c;也没弄过Linux的。不喜勿喷&#xff0c;有问题请指出 第一天一头雾水整了几个小时没结果&#xff0c;第二天豁然开朗&#xff0c;10分钟明白了第一天的问题所在。 Win10 安卓&#xff1a; iOS&#xff1a; 搭建DNS服务器的意义&#xff1a; 屏蔽…

运算放大器相关知识总结(1)

1、 前言 最近做了一个小项目&#xff0c;这个项目是研发一款阻抗测量仪。这个阻抗测量仪可以测量人体在不同频率下的生物电阻抗&#xff0c;该设备的核心是模拟电路&#xff0c;技术难点是减小模拟电路噪声。该项目前前忙了2个多月&#xff0c;借着研发这个项目的机会把自己掌…

ivrobot乐高EV3 鲸鱼 能力风暴自制遥控手柄库文件和编程样例 使用指南

编程示例&#xff1a; 资源下载链接&#xff1a; https://download.csdn.net/download/abilix_tony/88739582 EV3 mindstorms能用基础版和高阶版&#xff08;条形编程界面&#xff09; EV3 classroom只能用基础版 &#xff08;scratch模块形状编程界面&#xff09; 请根据使…

WEB前端人机交互导论实验-实训2格式化文本、段落与列表

1.项目1 文本与段落标记的应用&#xff1a; A.题目要求: B.思路&#xff1a; &#xff08;1&#xff09;首先&#xff0c;HTML文档的基本结构是通过<html>...</html>标签包围的&#xff0c;包含了头部信息和页面主体内容。 &#xff08;2&#xff09;在头部信息…

【AI的未来 - AI Agent系列】【MetaGPT】2. 实现自己的第一个Agent

在MetaGPT中定义的一个agent运行示例如下&#xff1a; 一个agent在启动后他会观察自己能获取到的信息&#xff0c;加入自己的记忆中下一步进行思考&#xff0c;决定下一步的行动&#xff0c;也就是从Action1&#xff0c;Action2&#xff0c;Action3中选择执行的Action决定行动…

ADSelfService Plus 推出离线多因素身份验证以提升远程工作安全性

采用先进验证方法&#xff0c;确保在任何时间、地点或连接问题下对业务数据的合法访问即使远程用户未连接到身份验证服务器或互联网&#xff0c;也可通过MFA安全认证。 MFA 得克萨斯州德尔瓦雷 — 2023年5月3日 — Zoho Corporation 旗下的企业IT管理部门ManageEngine今日宣布…

抖音小店无货源爆单技巧大公开!教你如何与达人合作!

大家好&#xff0c;我是电商花花。 现在越来越多的人开始关注抖音小店电商&#xff0c;尝试着做抖音小店&#xff0c;我们做抖音小店除了要选品之外&#xff0c;我们还要学会找达人合作&#xff0c;让达人帮我们带货出单。 今天给大家讲一下如何找达人合作带货&#xff0c;如…

【AIGC】AnimateDiff:无需定制化微调的动画化个性化的文生图模型

前言 Animatediff是一个有效的框架将文本到图像模型扩展到动画生成器中&#xff0c;无需针对特定模型进行调整。只要在大型视频数据集中学习到运动先验知识。AnimateDiff就可以插入到个性化的文生图模型中&#xff0c;与Civitai和Huggingface的文生图模型兼容&#xff0c;也可…

polar CTF CB链

一、题目 二、解答 1、通过jar包&#xff0c;可以看到/user路由下有反序列化操作 看到存在commons-beanutils依赖且版本为1.9.2&#xff0c;可利用CB链Getshell。 使用ysoserial项目中的CommonsBeanutils1链写一个POC&#xff0c;注意确保ysoserial项目中的pom.xml中的comm…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux网络编程第一天-socket编程(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式培训笔记,嵌入式硬件,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机领域.https://blog.csdn.net/weixin_3980490…

8.1 Centos安装部署Redis

文章目录 前言一、下载Redis二、编译Redis三、配置redis.conf四、启动Redis服务端五、启动Redis客户端测试前言 本文将手把手演示在CentOS7上安装部署Redis。 一、下载Redis 可以使用wget命令进行下载,这里下载到/app目录 wget http://download.redis.io/releases/redis-5.…

Centos安装Datax

Centos7安装DataX 一、DataX简介二、DataX的数据源支持三、安装DataX1、下载DataX2、解压3、检验是否安装成功4、使用 四、实践案例1、环境信息2、编写同步的配置文件(user_info.json)3、执行同步4、验证同步结果 一、DataX简介 DataX 是阿里云 DataWorks数据集成 的开源版本&a…

RocketMQ源码阅读-Message消息存储

RocketMQ源码阅读-Message消息存储 1. CommitLog的作用2. CommitLog 存储消息3. 时序图4. 小结 在Broker消息接收一篇中&#xff0c;分析到Broker接收到消息&#xff0c;最终会调用CommitLong#putMessage方法存储消息。 本篇来分析CommitLong#putMessage存储消息的流程。 1. C…

自编C++题目——战争

预估难度 困难 题目描述 国与国以河为界&#xff0c;有一天他们两国发生了战争&#xff0c;在边疆的战士开始了厮杀。小明是一个参谋&#xff0c;他也知道两国的兵都能打个人&#xff0c;所以他想让你帮忙安排布置兵&#xff0c;以击杀所有国的兵。 打仗规则 只能打在同一…

鸿蒙应用开发尝鲜:初识HarmonyOS

初识HarmonyOS 来源:华为官方网站 : https://developer.huawei.com/ 相信大家对鸿蒙应用开发也不在陌生,很多身处互联网行业或者不了解的人们现在也一定都听说过华为鸿蒙.这里我将不再说废话,直接步入正题 鸿蒙应用开发语言 HarmonyOS应用开发采用的是ArkTS语言,ArkTS是在Typ…

高校站群内容管理系统开发语言各有优势

站群管理系统开发可以选择多种编程语言&#xff0c;具体选择哪种语言最好需要考虑多个因素&#xff0c;包括开发团队的技术栈、项目需求、性能要求、安全性等。下面列举一些常见的编程语言及其适用场景&#xff1a; PHP&#xff1a;PHP是一种广泛使用的服务器端脚本语言&#…

数据结构:堆和堆排序

数据结构&#xff1a;堆和堆排序 文章目录 数据结构&#xff1a;堆和堆排序1.二叉树的存储结构1.顺序结构2.链式结构 2.堆3.堆的实现4.堆排序&#xff08;选择排序中的一类&#xff09;1. 基本思想2.代码实现 1.二叉树的存储结构 1.顺序结构 顺序结构存储就是使用数组来表示一…

【数据结构 | 直接插入排序】

直接插入排序 基本思路直接插入排序SelectSort 基本思路 扑克牌是我们几乎每个人都可能玩过的游戏最基本的扑克玩法都是—边模牌,— 边理牌。加入我们拿到如图这样的扑克牌&#xff1a; 我们会按照如下理牌&#xff1a; 将3和4移动至5的左侧&#xff0c;再将2移动到最左侧&a…

按键开关机的锂电池充放电解决方案

一、产品概述 TP4562 是一款集成线性充电管理、同步升压转换、电池电量指示和多种保护功能的单芯片电源管理SOC&#xff0c;为锂电池的充放电提供完整的单芯片电源解决方案。 TP4562 内部集成了线性充电管理模块、同步升压放电管理模块、电量检测与 LED 指示模块、保护模块、…