2024/3/10总结:数据结构教程:顺序表的创建以及基本的12个操作

首先,按照惯例,欢迎大家边听歌边看本博客!!!

这里是神奇的赛尔号_张杰 (kugou.com)

一.背景:由于是上机实验,直接引用数据结构教程第6版73页的实验题1

修改第6,7,8,10题改为由用户输入而非直接求!

二.代码

同上期,由于比较简单和有较多注释的原因,笔者在这里不再赘述!

值得注意的是一定要先搞清楚用户输入的逻辑序号(就是我认为A是第一位),但是在数组中即在物理序号中(A在a【0】的位置),这里多次决定了循环需不需要等号,代码很长且每部分关联性较强,所以一个等号的失误可能会促成全局的错误,建议大家写完一部分后编译运行一下!!!!

#include<iostream>
using namespace std;

#define Max 100000
typedef char ch;//将数据类型改成ch,方便代码修改 
typedef struct //创建一个自己想要的关键字,这是结构体
{//这里补充:由于我们创建的是一个顺序表,定义了关键字后,结构体的内容就应该为顺序表中我们想实现的功能 
	ch data[Max];//存储字母 
	int lth;//length长度 
}Sqlist;//关键字的名称叫做Sqlist,因为我们要做一个顺序表 

//初始化顺序表
void Initsqlist(Sqlist *&L)//内容包括开辟空间,定义长度 
{
	L=new Sqlist;
	L->lth=0;
} 
//释放顺序表
void destroysqlist(Sqlist *&L)
{
	delete L;
}

//插入元素 
bool Insertsqlist(Sqlist *&L,int i,ch e)//感想:为什么要用bool,因为要两种不同的回答
{ 
	if(i<1||i>L->lth+1)//逻辑,逻辑序号判断 
		return false;
	i--;//更改为物理序号 
	for(int j=L->lth;j>i;j--)
	{
		L->data[j]=L->data[j-1];
	} 
	L->data[i]=e;
	L->lth++;
	return true;
} 
//删除元素
bool delem(Sqlist *&L,int i,ch &o)
{ 
	if(i<1||i>=L->lth+1) 
		return false;
	i--; 
	o=L->data[i];
	for(int j=i;j<L->lth-1;j++)
	{
		L->data[j]=L->data[j+1];
	} 
	L->lth--;
	return true;
} 

//输出顺序表
void displaysqlist(Sqlist *L)
{
	for(int i=0;i<L->lth;i++)
		cout<<L->data[i]<<"   ";
} 
//输出顺序表的长度
int displaylength(Sqlist *L)
{
	return L->lth;
}
//判断顺序表是否为空
bool listempty(Sqlist *L)
{

	return (0==L->lth);
	
}
//输出某个元素(判断可不可取)
bool getlist(Sqlist *L,int i,ch &tmp)//感想:这种三个参数的好处就在于既可以判断,还可以直接锁定输出
{
	if(i<1||i>=L->lth+1)
		return false;
	i--;
	tmp=L->data[i];
	return true;
}
//输出元素的位置(判断存不存在)
int locelem(Sqlist *L,ch tmp)
{
	int k=0;//物理序号从0开始
	while(k<=L->lth-1&&L->data[k]!=tmp){
		k++;
	}
	if(k>=L->lth)
		return 0;
	else 
		return k+1;//返回逻辑序号
}

int main()
{
	Sqlist *L1;Initsqlist(L1);
	cout<<"1.初始化顺序表成功!!!"<<endl<<endl;
	
	int h=1;
	ch a[10]={'A','B','C','D','E'};	
	cout<<"2.依次插入ABCDE."<<"    "; 
	for(int i=0;i<5;i++)
	{
		if(!Insertsqlist(L1,i+1,a[i]))//这里注意我们所输入的参数是逻辑序号,在第一位插入 
			{
				cout<<"Warning:插入失败!!!请重试"<<endl;
				h=0;
			}
	}
	if(h)
		cout<<"插入成功!!!"<<endl<<endl; 
	//输出顺序表	
	cout<<"3.当前顺序表的元素有:";displaysqlist(L1);cout<<endl<<endl;
	//输出长度
	cout<<"4.当前顺序表的长度为:"<<displaylength(L1)<<endl<<endl;
	//空表
	cout<<"5.当前顺序表";
	if(listempty(L1))
		cout<<"为空表"<<endl<<endl;
	else
		cout<<"不为空表"<<endl<<endl;
	//取值(输出元素)
	cout<<"6.取值操作:";
	ch temp;int p;
	cout<<"请输入您要取哪个位置的值:";cin>>p;
	if(getlist(L1,p,temp))
		cout<<"取值成功! "<<"顺序表第"<<p<<"位的元素是:"<<temp<<endl<<endl;
	else
		cout<<"取值失败,您输入的位置"<<p<<"越界!!!"<<endl<<endl;
	cout<<"7.查找操作:";
	ch find;
	cout<<"请输入您要查找的元素:  ";cin>>find;
	if(locelem(L1,find)==0)
		cout<<"对不起,当前顺序表中没有您查找的元素!!"<<endl<<endl;
	else
		cout<<"查找成功,您所查找的元素"<<find<<"在当前顺序表的第"<<locelem(L1,find)<<"位"<<endl<<endl;
	
	cout<<"8.插入操作:";
	int k;ch q;
	cout<<"请您输入一个数字和一个字符,代表在第几位插入一个字符:";cin>>k>>q;
;	if(!Insertsqlist(L1,k,q))
		cout<<"Warning:输入序号越界,插入失败!!!"<<endl;
	else
		cout<<"插入成功!!!"<<endl<<endl; 
	cout<<"9.当前顺序表的元素有:";displaysqlist(L1);cout<<endl<<endl;
	//删除元素
	cout<<"10.删除操作:";
	int y;ch o;
	cout<<"请您输入要删除的元素的序号:";cin>>y;
	if(!delem(L1,y,o))
		cout<<"对不起,您的输入的序号有误(越界),删除失败!"<<endl<<endl;
	else
		cout<<"删除成功!成功删除第"<<y<<"个元素"<<o<<endl<<endl;
	cout<<"11.当前顺序表的元素有:";displaysqlist(L1);cout<<endl<<endl;
	//释放顺序表
	cout<<"12.销毁顺序表:";
	destroysqlist(L1);
	cout<<"销毁成功!!!";
	return 0;
}

//值得注意
//1.顺序表的长度是逻辑序号
//我们查找插入所输入的序号也是逻辑序号

全部输入正确的例子

全部错误的例子

这里给大家推荐几组试错样例

第六部分输入:6或者-1

第七:A,a或者凌乱的程序猿

第八:6 o

第10:6

反复试试边缘数字对修改代码也是有用处的!!!

其实在编写代码的时候笔者也考虑到了,因为提前看过书本,思维比较定式,以上代码多个部分可以优化重改,

bool和return int 其实两者代码是可以互换的,而且个人觉得return int会比较通顺,输入bool也不难,但是一旦错了,在bool这里会比较犹豫,然后就是什么时候三个参数,什么时候几个参数,什么时候使用&,什么时候使用*了

做了这么久不难发现struct *l其实就是一个指向结构题体的指针(具体在上期的复数已经注释过了,不赘述)

需要改变传进来的数时使用&(引用)

多少参数主要看函数的作用,比如我们的插入函数的作用是判断和传值,所以我们把结构体放进来,需要序号,需要字符,所以三个,再写的时候可以先想想这个函数的功能是什么,然后再写!!

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

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

相关文章

CI/CD笔记.Gitlab系列:控制台强制修改root用户密码

CI/CD笔记.Gitlab系列 控制台强制修改root用户密码 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.cs…

SpringBoot中的上传文件接口

SpringBoot中的上传文件 上传文件的操作在有些功能中属于比较常用的环节&#xff0c;这里整理下SpringBoot环境中上传文件的实现方式。 这里实现的是上传文件的后台接口&#xff0c;前端部分可以用测试工具模拟实现&#xff0c;就先不在这里表述了。 Dto层 使用MultipartFile…

【C++】类和对象(六个默认成员函数)

文章目录 类的六个默认成员函数**构造函数****构造函数的目的****构造函数的特性** 析构函数析构函数概念析构函数处理的顺序析构函数清理细节 拷贝构造函数拷贝构造函数典型调用场景 赋值运算符重载运算符重载赋值运算重载前置和后置 重载 const成员函数再提权限的问题: 取地址…

Guiding Large Language Models viaDirectional Stimulus Prompting

1. 通过定向刺激提示指导大语言模型 论文地址&#xff1a;[2302.11520] Guiding Large Language Models via Directional Stimulus Prompting (arxiv.org) 源码地址&#xff1a;GitHub - Leezekun/Directional-Stimulus-Prompting: [NeurIPS 2023] Codebase for the paper: &qu…

目标检测论文模型笔记——RCNN系列

RCNN系列模型&#xff08;two-stages、基于区域的)主要包括以下几种&#xff0c;按发布时间排序&#xff1a; RCNN&#xff08;2014年&#xff09;&#xff1a;首次将深度学习应用于目标检测&#xff0c;通过选择性搜索Selective Search提出候选区域&#xff0c;然后使用CNN&am…

章六、集合(1)—— 概念、API、List 接口及实现类、集合迭代

零、 关闭IDEA调试时自动隐藏空元素 一、 集合的概念 存储一个班学员信息&#xff0c;假定一个班容纳20名学员 当我们需要保存一组一样&#xff08;类型相同&#xff09;的元素的时候&#xff0c;我们应该使用一个容器来存储&#xff0c;数组就是这样一个容器。 数组有什么缺…

9. 内核、文件系统加载工具

内核、文件系统加载工具 内核、文件系统加载工具是嵌入式开发必备的工具 1. 烧写BootLoader 1.1 通过超级终端方式 烧写 Bootloader 可以使用超级终端的“传送” |“发送文件”命令进入发送文件对话框&#xff0c;使用 Xmodem 协议和 Kermit 协议发送 Bootloader 的各个文件…

《计算机网络》考研:2024/3/9 2.1.7-数据交换方式;2.2-物理层传输介质;2.3-物理层设备

2024/3/9 2.1.7、2.2、2.3 2.1.7 数据交换方式 电路交换存储转发方式 报文交换分组交换&#xff1a; 数据报方式虚电路方式 电路交换 报文交换 分组交换 2.2 物理层传输介质 物理层的主要任务 物理层设备 中继器&#xff1a; 集线器&#xff08;多口中继器&#xff09;…

如何获取用户请求的真实ip,并返回访问者的ip地理位置?node,vue

一、获取真实IP 方式1、前端调用免费公共接口获取 前端获取访问者的真实的外网ip,可以通过调用接口https://api.ipify.org/来获取。你也可以直接在网页上访问它来看自己的外网ip。 ipify介绍&#xff1a; ipify是一个免费的公共 API&#xff0c;用于获取设备的公共 IP 地址。…

Claude3横空出世:颠覆GPT-4,Anthropic与亚马逊云科技共启AI新时代

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

exceljs解析和生成excel文件

安装 npm install exceljs解析excel 通过 Workbook 的 readFile 方法可以拿到workbook对象, workbook对象包含的概念有 worksheet(工作表) --> row(行) --> cell(单元格).于是可以通过依次遍历 worksheet, row, cell来拿到单元格的数据直接通过 worksheet.getSheetValue…

从零学习Linux操作系统 第三十五部分 Ansible中的角色

一、理解roles在企业中的定位及写法 #ansible 角色简介# Ansible roles 是为了层次化&#xff0c;结构化的组织Playbookroles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中&#xff0c;并可以便捷地include它们roles一般用于基于主机构建服务的场景中&…

Springboot 集成kafka 消费者实现ssl方式连接监听消息实现消费

证书准备&#xff1a;springboot集成kafka 消费者实现 如何配置是ssl方式连接的时候需要进行证书的转换。原始的证书是pem, 或者csr方式 和key方式的时候需要转换&#xff0c;因为kafka里面是jks 需要通过openssl进行转换。 证书处理&#xff1a; KeyStore 用于存储客户端的证…

Java多线程实战-实现多线程文件下载,支持断点续传、日志记录等功能

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 前言 1 基础知识回顾 1.1 线程的创建和启动 1.2 线程池的使用 2.运行环境说…

k8s架构浅析

Node 节点&#xff08;物理主机或虚拟机&#xff09;&#xff0c;它们共同组成一个分布式集群&#xff0c;并且这些节点中会有一个 Master 节点&#xff0c;由它来统一管理 Node 节点。 Pod &#xff0c;在 K8S 中&#xff0c;Pod 是最基本的操作单元&#xff0c;它与 docker …

Linux之selinux详解

华子目录 概念作用selinux与传统的权限区别selinux工作原理名词解释主体&#xff08;subject&#xff09;目标&#xff08;object&#xff09;策略&#xff08;policy&#xff09;&#xff08;多个规则的集合&#xff09;安全上下文&#xff08;security context&#xff09; 文…

三栏布局的实现方法

1. 什么是三栏布局 常见的一种页面布局方式&#xff0c;将页面分为左栏、中栏和右栏左右两侧的盒子宽度固定&#xff0c;中间的盒子会随屏幕自适应一般中间放主体内容&#xff0c;左右两边放辅助内容 2. 如何实现三栏布局 2.1 弹性布局 将最外层盒子设为弹性布局&#xff0…

练习题-14

问题&#xff1a;已知函数 f : R → R f: \mathbb{R} \to \mathbb{R} f:R→R满足 f ( x y ) − f ( x − y ) f ( x ) f ( y ) , ∀ x , y ∈ R . f(xy)-f(x-y)f(x)f(y), \forall x, y \in \mathbb{R}. f(xy)−f(x−y)f(x)f(y),∀x,y∈R. 求 f f f. 提示&#xff1a;如果 f …

基于PBS向超算服务器队列提交任务的脚本模板与常用命令

本文介绍在Linux服务器中&#xff0c;通过PBS&#xff08;Portable Batch System&#xff09;作业管理系统脚本的方式&#xff0c;提交任务到服务器队列&#xff0c;并执行任务的方法。 最近&#xff0c;需要在学校公用的超算中执行代码任务&#xff1b;而和多数超算设备一样&a…

基于美洲狮优化算法(Puma Optimizar Algorithm ,POA)的无人机三维路径规划(提供MATLAB代码)

一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径&#xff0c;使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一&#xff0c;它可以通过算法和模型来确定无人机的航迹&#xff0c;以避开障碍物、优化飞行…