数据结构与算法学习笔记之线性表二---顺序表的静态存储表示和实现(C++)

目录

前言

1.什么是顺序表

2.顺序表的静态存储表示

1.初始化

2.长度

3.数据元素

4.长度

5.获取元素下标

6.前驱节点

7.后继节点

8.插入

9.删除

10.遍历

11.测试代码


前言

    这篇文章讲的是顺序表的两种实现方式。

1.什么是顺序表

        线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。

        顺序表有以下性质:

图1.线性表中数据元素之间的关系

图2.线性表的顺序存储结构示意图

2.顺序表的静态存储表示

        我们使用数组来实现顺序表的静态表示,数组中的数据元素在存储中是连续的,但是使用数组表示顺序表有个缺点就是数组的长度不可变。

        顺序表的静态表示定义如下:

#define MAX_SIZE 10           //定数顺序表的最大表长
typedef int ElementType;
typedef int Status;
typedef struct StaticSqList {ElementType data[MAX_SIZE]; // 数据元素存储区int length; // 当前长度
}StaticSqList;

1.初始化

        初始化的时候,表长为空

// 初始化
void initStaticSqList(StaticSqList * sqList){sqList->length = 0;
}

2.长度

        返回静态顺序表的长度

// 长度
int staticSqListLength(StaticSqList *sqList){return sqList->length;
}

3.数据元素

        遍历数组

// 获取元素
Status getElemForStaticSqList(StaticSqList *sqList,int location,ElementType * element){if (location < 0 || location > sqList->length - 1) {return 0;}*element = sqList->data[location];return 1;
}

4.长度

// 长度
int staticSqListLength(StaticSqList *sqList){return sqList->length;
}

5.获取元素下标

// 获取元素
Status getElemForStaticSqList(StaticSqList *sqList,int location,ElementType * element){if (location < 0 || location > sqList->length - 1) {return 0;}*element = sqList->data[location];return 1;
}

6.前驱节点

// 前驱节点
Status priorElemForStaticSqList(StaticSqList *sqList,ElementType currentElement,ElementType * priorElement){for (int i = 0 ; i< sqList->length; i++) {if (sqList->data[i] == currentElement) {if (i - 1 > 0) {* priorElement = sqList->data[i-1];return 1;}}}return 0;
}

7.后继节点

// 后继节点
Status nextElemForStaticSqList(StaticSqList *sqList,ElementType currentElement,ElementType * nextElement){for (int i = 0 ; i< sqList->length; i++) {if (sqList->data[i] == currentElement) {if (i <= MAX_SIZE - 1) {* nextElement = sqList->data[i+1];return 1;}}}return 0;
}

8.插入

// 插入
Status insertStaticSqList(StaticSqList *sqList,int pos,ElementType element){if (pos < 0 || pos > sqList->length+1 || sqList->length == MAX_SIZE) {return 0;}for (int i = sqList->length; i > pos -1; i --) {//插入位置之后的元素后移sqList[i] = sqList[i-1];}sqList->data[pos-1] = element;sqList->length++;return 1;
}

9.删除

// 测试函数
void testStaticSqList(){StaticSqList sqList;cout<<"顺序表初始化......"<<endl;initStaticSqList(&sqList);cout<<"顺序表判空和长度计算......"<<endl;if (emptyStaticSqList(&sqList)) {cout<<"顺序表为空,长度为"<<staticSqListLength(&sqList)<<endl;}cout<<"顺序表插入测试......"<<endl;for (int i = 1; i <=11 ; i++) {if (insertStaticSqList(&sqList, sqList.length + 1, i)) {cout<<"数据元素"<<i<<"插入成功"<<endl;}else{cout<<"数据元素"<<i<<"插入失败"<<endl;}}cout<<"插入之后的静态顺序表"<<endl;traverseStaticSqList(&sqList);cout<<"顺序表删除测试......"<<endl;ElementType element;if (deleteStaticSqList(&sqList, 10, &element)) {cout<<"数据元素"<<element<<"删除成功"<<endl;}cout<<"删除之后的静态顺序表"<<endl;traverseStaticSqList(&sqList);//后继节点测试ElementType nextElement;if (nextElemForStaticSqList(&sqList, 8, &nextElement)) {cout<<"数据元素8"<<"后继节点为:"<<nextElement<<endl;}else{cout<<"后继节点不存在"<<endl;}//后继节点测试ElementType priorElement;if (priorElemForStaticSqList(&sqList, 8, &priorElement)) {cout<<"数据元素8"<<"前驱节点为:"<<priorElement<<endl;}else{cout<<"前驱节点不存在"<<endl;}cout<<"顺序表数据元素下标测试......"<<endl;for (int i = -1; i <= 12; i++) {int location;if (locationElemForStaticSqList(&sqList, i, &location)) {cout<<"数据元素"<<i<<"下标为:"<<location<<endl;}else{cout<<"数据元素不存在"<<endl;}}}
// 删除
Status deleteStaticSqList(StaticSqList *sqList,int pos,int * element){if (pos < 1 || pos > sqList->length|| sqList->length == 0) {return 0;}for (int i = pos - 1; i < sqList->length - 1; i ++) {//插入位置之后的元素后移sqList[i] = sqList[i+1];}* element = sqList->data[pos-1];sqList->length--;return 1;
}

10.遍历

// 遍历
void traverseStaticSqList(StaticSqList *sqList){for (int i = 0; i<sqList->length; i++) {cout<<sqList->data[i]<<"\t";}cout<<endl;
}

11.测试代码

// 测试函数
void testStaticSqList(){StaticSqList sqList;cout<<"顺序表初始化......"<<endl;initStaticSqList(&sqList);cout<<"顺序表判空和长度计算......"<<endl;if (emptyStaticSqList(&sqList)) {cout<<"顺序表为空,长度为"<<staticSqListLength(&sqList)<<endl;}cout<<"顺序表插入测试......"<<endl;for (int i = 1; i <=11 ; i++) {if (insertStaticSqList(&sqList, sqList.length + 1, i)) {cout<<"数据元素"<<i<<"插入成功"<<endl;}else{cout<<"数据元素"<<i<<"插入失败"<<endl;}}cout<<"插入之后的静态顺序表"<<endl;traverseStaticSqList(&sqList);cout<<"顺序表删除测试......"<<endl;ElementType element;if (deleteStaticSqList(&sqList, 10, &element)) {cout<<"数据元素"<<element<<"删除成功"<<endl;}cout<<"删除之后的静态顺序表"<<endl;traverseStaticSqList(&sqList);//后继节点测试ElementType nextElement;if (nextElemForStaticSqList(&sqList, 8, &nextElement)) {cout<<"数据元素8"<<"后继节点为:"<<nextElement<<endl;}else{cout<<"后继节点不存在"<<endl;}//后继节点测试ElementType priorElement;if (priorElemForStaticSqList(&sqList, 8, &priorElement)) {cout<<"数据元素8"<<"前驱节点为:"<<priorElement<<endl;}else{cout<<"前驱节点不存在"<<endl;}cout<<"顺序表数据元素下标测试......"<<endl;for (int i = -1; i <= 12; i++) {int location;if (locationElemForStaticSqList(&sqList, i, &location)) {cout<<"数据元素"<<i<<"下标为:"<<location<<endl;}else{cout<<"数据元素不存在"<<endl;}}}

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

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

相关文章

Double 4 VR情景智能互动教学系统在商务旅行课堂中的应用

一、提高学生的学习兴趣 传统的商务旅行课堂教学方式往往是教师讲授理论知识&#xff0c;学生被动接受。这种方式很难激发学生的学习兴趣&#xff0c;而Double 4 VR情景智能互动教学系统则可以通过虚拟现实技术&#xff0c;将商务旅行的场景生动地展示给学生&#xff0c;让学生…

医院如何做好漏费管理?什么是控费系统?控费系统现在成熟吗?

在中国深厚的人情土壤之中&#xff0c;某些医院里的医技科室&#xff0c;宛如隐秘的灰色地带&#xff0c;悄然滋生着利用职务之便谋取私利的暗流。这些科室的医务人员&#xff0c;以低于医院明文规定的收费标准&#xff0c;私下里为熟识的患者提供检查服务&#xff0c;仿佛形成…

【碎碎念4】向上社交

好久没写碎碎念系列了&#xff0c;最近关注到身边一些社交关系&#xff0c;想要和大家聊聊向上社交这件事情。首先小田认为向上社交或者仅仅是社交本身是无论什么年纪都需要关注的&#xff0c;因为处理好关系不仅仅会帮助我们把握好机会&#xff0c;同时也能让我们更好的建立自…

undolog

undolog回滚段 undolog执行的时间&#xff1a;在执行器操作bufferpool之前。 undolog页

我觉得这个域名证书监控平台又吊打Uptimekuma了

前面我们讲过uptimekuma 如何监控域名证书&#xff0c;很多人都喜欢 uptimekuma 那高端暗黑的色系上&#xff0c;然而最实用就是它的域名证书监控和历史可用性图表的展示上了&#xff0c;如下如&#xff1a; 但是这个东西吧&#xff0c;好看吗&#xff1f;好看&#xff0c;有用…

llama3 发布!大语言模型新选择 | 开源日报 No.251

meta-llama/llama Stars: 53.0k License: NOASSERTION llama 是用于 Llama 模型推理的代码。 提供了预训练和微调的 Llama 语言模型&#xff0c;参数范围从 7B 到 70B。可以通过下载脚本获取模型权重和 tokenizer。支持在本地快速运行推理&#xff0c;并提供不同规格的模型并…

机器学习作业4——朴素贝叶斯分类器

目录 一、理论 一个例子&#xff1a; 二、代码 对于代码的解释&#xff1a; 1.fit函数&#xff1a; 2.predict函数: 三、实验结果 原因分析&#xff1a; 一、理论 朴素贝叶斯分类器基于贝叶斯定理进行分类&#xff0c;通过后验概率来判断将新数据归为哪一类。通过利用贝…

MFC的CPen与CBush画图对象使用步骤

在MFC中&#xff0c;CPen和CBrush是两个常用的绘图对象&#xff0c;分别用于定义画笔和画刷&#xff0c;可以用于绘制图形、填充区域等。下面我会详细介绍如何在MFC中使用CPen和CBrush来绘制和填充图形。 使用 CPen 绘制图形&#xff1a; 创建 CPen 对象&#xff1a; 首先&am…

桥梁监控可视化大屏:现代桥梁管理的必备呀。

桥梁监控上可视化有几个重要的原因&#xff1a; 01.实时监控&#xff1a; 可视化的监控系统可以实时显示桥梁的各项监测数据&#xff0c;包括结构变形、振动、温度等&#xff0c;使监控人员能够实时了解桥梁的状态&#xff0c;及时发现异常情况并采取相应的措施。 02.数据分析…

MySQL前缀索引、脏页和干净页、COUNT(*)讨论、表删除内存问题

文章目录 如何加索引如何给身份证号添加索引 SQL语句变慢脏页 (Dirty Pages)干净页 (Clean Pages)为何区分脏页和干净页处理脏页管理策略 flush如何控制 为什么删除表数据后表文件大小不变问题背景核心原因数据存储方式参数影响 解决方案1. 调整innodb_file_per_table设置2. 使…

C#之三目运算、三元运算

三目运算也叫三元运算是一种简单的条件语句&#xff0c;也称为条件运算符。它可以根据一个表达式的结果确定另一个表达式的值。三目运算符使用“?”和“:”来表示。 注意使用bool值进行运算 三目运算符: 套路 三个空位 两个符号 固定写法 : 空位1 ? 空位2 : 空位3; 关键…

2024.5.8 —— LeetCode 高频题复盘

目录 检测循环依赖7. 整数反转LCR 170. 交易逆序对的总数55. 跳跃游戏45. 二叉树的后序遍历50. Pow(x, n)40. 组合总和 II74. 搜索二维矩阵26. 删除有序数组中的重复项61. 旋转链表 检测循环依赖 题目链接 def haveCircularDependency(self, n: int, prerequisites):g [[]for…

MATLAB实现遗传算法优化选址-路径LRP问题(Location-Routing Problem)

MATLAB实现遗传算法优化选址-路径LRP问题(Location-Routing Problem) 一、模型 选址车辆路径问题&#xff08;Location-Routing Problem, LRP&#xff09;是一个组合优化问题&#xff0c;旨在同时优化设施位置的选择和车辆的配送路径。在这个问题中&#xff0c;我们考虑一个由…

机器学习 - 决策树

1. 决策树基础 定义与概念 决策树是一种监督学习算法&#xff0c;主要用于分类和回归任务。它通过学习从数据特征到输出标签的映射规则&#xff0c;构建一个树形结构。在分类问题中&#xff0c;决策树的每个叶节点代表一个类别。 案例分析 假设我们有一个关于天气和是否进行…

linux防火墙的操作

linux防火墙的操作 前言1查看防火墙状态2暂时关闭防火墙3永久关闭防火墙4开启防火墙5开启指定端口6关闭指定端口7立即生效8查看开放的端口前言 systemctl是管理linux中服务的命令,可以对服务进行启动、停止、重启、查看状态等操作 firewall-cmd是linux中专门用于控制防火墙的…

并发-守护线程setDaemon()

目录 为什么存在 什么是守护线程 创建守护线程 在使用守护线程时需要注意以下几点 可以使用isDaemon()方法来检查线程是否是守护线程 例1&#xff1a;上面提到当JVM中只剩下守护线程的时候&#xff0c;JVM就会退出&#xff0c;那么写段代码测试下 例2&#xff1a;thread…

小红的字符串构造和小红的排列构造

小红的字符串构造 小红希望你构造一个长度为nnn的、仅包含小写字母的字符串&#xff0c;其中恰好有kkk个长度大于1的回文子串。你能帮帮她吗&#xff1f;输入两个整数n,k&#xff0c;用空格隔开。 1≤n≤10^5,0≤k≤n/2.一个字符串。如果有多解输出任意即可。 可以证明&#x…

[Bug]:由于中国防火墙,无法连接 huggingface.co

问题描述 : OSError: We couldnt connect to https://huggingface.co to load this file, couldnt find it in the cached files and it looks like youscan/ukr-roberta-base is not the path to a directory containing a file named config. Json. Checkout your internet …

[AIGC] 几道 redis数据结构相关面试题

文章目录 7. 数据类型的实现8. 什么是空间预分配以及惰性空间释放&#xff0c;SDS 是怎么实现的9. 为什么说 SDS 是二进制安全的呢10. 说说 redis 里的对象11. 使用 RedisObject 的好处12. RedisObject 的具体结构是什么 7. 数据类型的实现 8. 什么是空间预分配以及惰性空间释放…

Vue3实战笔记(16)—pinia基本用法--Getter

文章目录 前言一、pinia的getter简单理解二、访问其他 store 的 getter总结 前言 在 Pinia 中&#xff0c;getter 类似于 Vuex 中的 getter&#xff0c;允许你从 store 中派生出一些状态&#xff0c;而不需要修改原始状态。这使得我们可以创建基于现有状态的计算属性。 一、pi…