数据结构——顺序表基本操作的实现(初始化、取值、查找、插入)

一、线性表与顺序表的概述

线性表的数据元素的逻辑特征是线性的,是一种典型的线性结构。这样的结构可以借鉴数组,如数组a[10]中,a[1]前一定是a[0],a[1]后一定是a[2],首结点(a[0])前面无元素,尾结点(a[9])后面无节点。

顺序表表示数据元素不仅在逻辑上线性,并且存储位置也是线性的。逻辑线性如上述例子所示,而数据元素的存储位置线性可解释为:当数组a[10]的数据类型为int(int型占4个字节),此时假设a[0]的初始地址为0x0000 0000,则可以直接推出a[1]的地址为0x0000 0004……a[4]的地址为0x0000 0010。

二、顺序表基本操作的实现

1、头文件

#include <stdlib.h>
#include <stdio.h>
#include <iostream>

using namespace std;		//显示cout未定义,需要加上这句

2、宏定义

#define MaxSize		100
#define OK			1
#define ERROR		0
#define TRUE		1
#define FALSE		0
#define INFEASIBLE	-1
#define OverFlow	-2
typedef int ElemType;
typedef int status;

3、结构体定义

typedef struct
{
	//ElemType elem[MaxSize];		//数组表示(静态分配)
	ElemType *elem;			        //指针表示(动态分配)
	int length;
}SqList;

4、相关操作函数

(1)初始化顺序表

/* 初始化顺序表 */
status InitList(SqList &L)
{
	L.elem = (ElemType*)malloc(sizeof(ElemType) * MaxSize);		//为顺序表分配存储空间
	if (!L.elem) exit(OVERFLOW);								//存储分配失败退出
	L.length = 0;												//空表长度为0
	return OK;
}

(2)取值

/* 取值:将顺序表中第i个元素的值赋给e */
status GetElem(SqList &L, int i, ElemType &e)
{
	if (i < 1 || i>100) return ERROR;
	e = L.elem[i - 1];
	return OK;
}

(3)查找顺序表中元素

/* 查找e位于顺序表L中的位置 */
status LocateElem(SqList L, ElemType e)
{
	int i = 0;
	for (int i = 0; i < L.length; i++)
	{
 		if (L.elem[i] == e)
		{
			return i + 1;
		}
	}
	return ERROR;
}

(4)删除元素

/* 删除元素,若要将删除的元素保存起来,则添加形参ElemType e */
status ListDelete(SqList &L, int i)
{
	if (i<1 || i>L.length) return ERROR;
	for (int j = i; j <= L.length - 1; j++)
	{
		L.elem[j - 1] = L.elem[j];
	}
	L.elem[L.length - 1] = 0;				//将最后一个元素清零
	L.length--;								//表长-1
	return OK;
}

(5)打印顺序表中所有元素

/* 打印顺序表中所有元素 */
status ShowListElem(SqList L)
{
	for (int i = 0; i < L.length; i++)
	{
		cout << L.elem[i] << " ";
	}
	cout << " " << endl;
	return OK;
}

(6)插入元素

/* 插入元素 */
status ListInsert(SqList &L, int i, ElemType e)
{
	if (i<1 || i>L.length+1) return ERROR;		
	if (L.length == MaxSize) return ERROR;
	for (int j = L.length-1; j >= i - 1; j--)
	{
		L.elem[j + 1] = L.elem[j];
	}
	L.elem[i - 1] = e;
	L.length++;
	return OK;
}

 (7)其他函数

/* 
	销毁已存在的顺序表
	若分配存储时用new,则对应用delete;若采用malloc,则用free。
*/
status ListDestroy(SqList &L)
{
	free(L.elem);
	return OK;
}
/* 清空顺序表 */
status ListClear(SqList &L)
{
	L.length = 0;
	return OK;
}
/* 顺序表是否为空 */
status IsEmpty(SqList &L)
{
	if (!L.length) return TRUE;
	else return FALSE;
}
/* 顺序表的长度 */
status ListLength(SqList &L)
{
	return L.length;
}

(8)main 

int main(void)
{
	int a[5] = { 1,2,4,5,6 };
	SqList L;
	InitList(L);
	cout << "顺序表的初始长度为:" << L.length << endl;
	L.elem = a;
	L.length = 5;
	ShowListElem(L);
	cout << "存入数据后,顺序表的长度为:" << L.length << endl;
	int b = 0;				//GetElem中将顺序表中的第i个元素赋给b
	int Location = 0;		//表示c位于顺序表的位置
	int c = 5;				//LocateElem在顺序表中定位c
	GetElem(L, 3, b);
	cout << "未操作时,取出值为:" << b << endl;
	ListInsert(L, 3, 3); 
	GetElem(L, 3, b);
	cout << "插入3之后,取出值为:" << b << endl;
	ShowListElem(L);
	cout << "插入3之后,顺序表长度为:" << L.length << endl;
	Location = LocateElem(L, c);
	cout << "6位于顺序表的位置:" << Location << endl;
	ListDelete(L, 3);
	GetElem(L, 3, b);
	cout << "删除3之后,取出值为:" << b << endl;
	cout << "删除3之后,顺序表长度为:" << L.length << endl;
	Location = LocateElem(L, c);
	cout << "6位于顺序表的位置:" << Location << endl;
	ListClear(L);
	cout << "清空链表后,顺序表长度为:" << L.length << endl;

	return 0;
}

三、现象及问题

1、现象

2、问题

(1)为什么有时候用引用&,有时候却不用呢?

答:引用是C++的语法,运用引用时,表示在该函数中形参变化,实参也会随之变化,同指针效果一致。简单说就是,当你认为在函数中需要改变传入函数中参数的值时,就可以利用引用。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot+vue的致远汽车租赁系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

如何用AI工具提升日常工作效率,帮我们提速增效减负

昨天&#xff0c;coze海外版支持了GPT4o&#xff0c; 立马体验了下&#xff0c;速度杠杠的。 https://www.coze.com 支持chatGP和gemini模型&#xff0c;需要科学上网。国内 https://www.coze.cn支持语雀、KIMI模型。 这里回到正题&#xff0c; 如何用AI工具提升日常工作效率…

对于高速信号完整性,一块聊聊啊(10)

本文包含的主要内容有: 过孔设计概述:从前面的各种基础知识到过孔设计,逐步对信号完整性有了初步了解,在过孔设计这里稍微做一个概述,也是个人的一些理解,算是一个小结。 过孔设计的必要性。 过孔结构的基础知识 实例:过孔设计仿真HFSS实例 过孔设计概述 通过前面…

2024年电工杯A题论文首发+摘要分享+问题一代码分享

问题一论文代码链接&#xff1a;https://pan.baidu.com/s/1kDV0DgSK3E4dv8Y6x7LExA 提取码&#xff1a;sxjm --来自百度网盘超级会员V5的分享 园区微电网风光储协调优化配置 摘要&#xff1a;园区微电网由风光发电和主电网联合为负荷供电&#xff0c;为了尽量提高风光电量的…

C# Sdcb.PaddleInference 中文分词、词性标注

C# Sdcb.PaddleInference 中文分词、词性标注 目录 效果 项目 代码 下载 参考 效果 项目 代码 using Sdcb.PaddleNLP.Lac; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Windows.Forms; namespace C__Sdcb.Pad…

文心智能体,零代码构建情感表达大师智能体

前言 随着智能体技术的突飞猛进&#xff0c;各行各业正迎来前所未有的变革与机遇。智能体&#xff0c;作为人工智能领域的重要分支&#xff0c;以其自主性、智能性和适应性&#xff0c;正逐步渗透到我们生活的每一个角落&#xff0c;成为推动社会进步和科技发展的新动力。 为了…

王炸! Coze图像流发布,我用它实现了海马体影楼级形象照(内附喂饭级教程

最近Coze图像流发布&#xff0c;我用它实现了海马体风格照片Bot: 照片魔术师。你可以自定义提供模版&#xff0c;也可以根据你的需求生成模版&#xff01; 这篇文章&#xff0c;全文不废话&#xff0c;只讲干货 二话不说&#xff0c;先来看看帅气的奥特曼怎么生成吧吧&#xff…

海外媒体发稿的关键步骤和投稿策略:如何撰写高质量的新闻稿?国外软文发布平台有哪些?

发布国外新闻稿件是一个涉及多步骤的过程&#xff0c;旨在确保您的新闻稿能够有效覆盖目标受众。以下是一些关键步骤和实用的技巧&#xff0c;帮助你实现海外媒体发稿。 1. 明确目标和受众 首先&#xff0c;明确您发布新闻稿的目标&#xff0c;是为了增加品牌曝光、推出新产品…

低利率之后如何选择?以日本养老金为例

天风证券认为&#xff0c;日本养老金资产配置行为具备的关键特征包括&#xff1a;海外资产占比上升、日元境内资产占比下降&#xff1b;权益类&#xff08;包括境内和境外&#xff09;占比上升&#xff0c;等等。 日本从1990年代开始陷入低增长、低通胀的局面&#xff0c;我们以…

十五、Python模块(入门一定看!!!)「长期更新Python简单入门到适用」

首先什么是模块&#xff1f; 小伙伴们经常看我写的教程不难发现&#xff0c;前面我们用过几次模块就是sys的那个&#xff0c;其实python不仅标准库中包含了大量的模块&#xff08;也被称之为准模块&#xff09;&#xff0c;还有大量的第三方模块&#xff0c;开发者也可以自己发…

如何成为成功的AI产品经理

本文目录 1 AI产品经理的角色和职责 2 AI产品经理的必备知识技能 3 案例分析 4 总结一下 随着ChatGPT的大热&#xff0c;也带动今年的AI火了一把&#xff0c;很多公司都开始进行相关部署&#xff0c;自然产生了很多岗位需求。 来源&#xff1a;BOSS直聘 那么&#xff0c;要想当…

Go语言的内存泄漏如何检测和避免?

文章目录 Go语言内存泄漏的检测与避免一、内存泄漏的检测1. 使用性能分析工具2. 使用内存泄漏检测工具3. 代码审查与测试 二、内存泄漏的避免1. 使用defer关键字2. 使用垃圾回收机制3. 避免循环引用4. 使用缓冲池 Go语言内存泄漏的检测与避免 在Go语言开发中&#xff0c;内存泄…

React useState修改对象

在 React 中&#xff0c;useState 是一个 Hook&#xff0c;它可以让函数组件拥有状态。当想要改变一个对象类型的状态时&#xff0c;我们需要使用展开运算符&#xff08;...&#xff09;或者 Object.assign 来确保状态是正确地更新。 以下是一个使用 useState 来更新对象的例子…

ssm139选课排课系统的设计与开发+vue

选课排课系统的设计与开发vue 摘 要 互联网的普及&#xff0c;改变了人们正常的生活学习及消费习惯&#xff0c;而且也大大的节省了人们的时间&#xff0c;由于各种管理系统都再不断的增加&#xff0c;更方便了用户&#xff0c;也改良了很多的用户习惯。对于选课排课系统查询…

公司废弃的2014年群晖 DS215J 被我打包回家了,试玩一下

文章目录 简介安装查看存储、cpu、内存等信息DMS 学习video station 简介 群晖DS215J https://www.datastoreworks.com/DS215j.asp 下载&#xff1a;chrome-extension://oemmndcbldboiebfnladdacbdfmadadm/https://global.download.synology.com/download/Document/Hardware/…

针对上一篇微信同声传译语音播报部分坑的解决和优化

1. 上一篇语音播报其实是不完美的&#xff0c;就是如何停止上一个音频开始下一个音频的问题&#xff0c;我在此做一下修改 比如说&#xff1a;现在正在播放1&#xff0c;我点击2让2开始播放&#xff0c;1停止播放&#xff0c;我上面的写法是有问题的&#xff1a; 通过 innerAu…

【C++】AVL树和红黑树模拟实现

AVL树和红黑树 1. 背景2. AVL树的概念3. AVL树节点的定义4. AVL树的插入5. AVL树的旋转5.1. 左单旋5.2. 右单旋5.3. 左右单旋5.4. 右左单旋5.5. 旋转总结 6. AVL树的验证7. AVL树的性能8. 红黑树的概念9. 红黑树的节点的定义10. 红黑树的插入10.1. 情况一10.2.情况二 11. 红黑树…

HTTP 请求的完整过程

HTTP 请求的完整过程 当用户在浏览器输入网址回车之后&#xff0c;网络协议都做了哪些工作呢? 首先工作的是 浏览器应用程序&#xff0c;他要解析出 URL中的域名 根据域名获取对应的ip地址&#xff0c;首先从浏览器缓存中査看&#xff0c;如下可以査看浏览器中域名对应ip的解…

Python游戏编程:一步步用Python打造经典贪吃蛇小游戏

贪吃蛇作为一款极其经典且广受欢迎的小游戏&#xff0c;是早期 Windows 电脑和功能手机&#xff08;特别是诺基亚手机&#xff09;流行度极高的小游戏&#xff0c;是当时功能手机时代最具代表性的游戏之一。游戏的基本规则和目标十分简单&#xff0c;但却极具吸引力&#xff0c…

C# 正则表达式使用小计

此文档用于记录平时使用正则表达式的心得&#xff0c;不定期更新 基础 实例 替换实例一 //这里匹配以 “( 开头,以 )” 结尾的字符串 private static Regex REGEX_ARG_CONTENT new Regex("""(.*?)""");//此方法用于在匹配到的结果前添加字符…