hnust 1949: 顺序表实现(第二部分)

hnust 1949: 顺序表实现(第二部分)

题目描述

拷贝下面的代码,然后将顺序表实现第一部分的工作填入,再完成顺序表的GetElem,LocateElem和ListDelete操作,其他地方不得改动。
#include
#include
#include
using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。

typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型

#define MAXSIZE 100 //顺序表可能达到的最大长度

typedef struct {
ElemType *elem; //存储空间的基地址
int length; //当前长度
} SqList;

Status InitList(SqList &L) //算法2.1 顺序表的初始化
{
//构造一个空的顺序表L
L.elem = new ElemType[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间
if(!L.elem)
exit(OVERFLOW); //存储分配失败退出
L.length = 0; //空表长度为0
return OK;
}
void DestroyList(SqList &L)
{
if(L.elem)
delete []L.elem; //释放存储空间
}

int ListLength(SqList L)
{
/在此下面完成代码***********/

/************************/
}
bool ListEmpty(SqList L)
{
/在此下面完成代码
/

/************************/
}
Status GetElem(SqList L, int i, ElemType & e) //算法2.2 顺序表的取值
{
/在此下面完成代码
/

/************************/
}
int LocateElem(SqList L, ElemType e) //算法2.3 顺序表的查找
{
/在此下面完成代码
/

/************************/
}
Status ListInsert(SqList & L, int i, ElemType e) //算法2.4 顺序表的插入
{
/在此下面完成代码
/

/************************/
}
Status ListDelete(SqList & L, int i) //算法2.5 顺序表的删除
{
/在此下面完成代码
/

/***********************************/
}
void ListPrint(SqList L)
{
for(int i = 0; i < L.length; i++)
cout << L.elem[i] << ((i == L.length - 1) ? ‘\n’ : ’ ');
}
int main()
{
int i;
ElemType e;
SqList L;
string op;
InitList(L);
while(cin >> op) {
if(op == “Empty”)
cout << (ListEmpty(L) ? “Empty” : “Not empty”) << endl;
else if(op == “Insert”) {
cin >> i >> e;
if(ListInsert(L, i, e) == ERROR)
cout << “Insert failed” << endl;
else
ListPrint(L);
} else if(op == “Length”) {
cout << "List length is " << ListLength(L) << endl;
} else if(op == “GetElem”) {
cin >> i;
if(GetElem(L, i, e) == ERROR)
cout << “Out of index” << endl;
else
cout << “The elem at position " << i << " is " << e << endl;
} else if(op == “LocateElem”) {
cin >> e;
i = LocateElem(L, e);
if(i == 0)
cout << e << " is not found in list” << endl;
else
cout << e << " is found at the position " << i << endl;
} else if(op == “Delete”) {
cin >> i;
if(ListDelete(L, i) == ERROR)
cout << “Delete failed” << endl;
else
ListPrint(L);
}
}
DestroyList(L);
return 0;
}

输入
为线性表的操作系列,每个操作一行,具体见样例。
输出
如果输入为"Empty", 则根据表是否为空输出"Empty"或 “Not empty”。
如果输入为"Length",则输出表长。
如果输入为"Insert i e",插入失败则输出"Insert failed",否则在i位置插入e后输出插入后表中的所有元素。
如果输入为"GetElem i “,参数i错误输出"Out of index”,否则输出在i位置的元素。
如果输入为"LocateElem e",如果未发现输出"e is not found in list",否则输出e在表中第一次出现的位置。
如果输入为"Delete i",如果失败输出"Delete failed",否则删除i位置的元素后输出插入后表中的所有元素。
具体参见样例。
样例输入 Copy
Empty
Insert 1 7
Empty
Insert 2 3
Length
Insert 1 -100
Length
Insert 10 100
Length
Insert 2 10000
Empty
GetElem 2
GetElem 5
LocateElem 999
LocateElem 3
Delete 0
Delete 4
Delete 1
Length
样例输出 Copy
Empty
7
Not empty
7 3
List length is 2
-100 7 3
List length is 3
Insert failed
List length is 3
-100 10000 7 3
Not empty
The elem at position 2 is 10000
Out of index
999 is not found in list
3 is found at the position 4
Delete failed
-100 10000 7
10000 7
List length is 2

解题过程

这段C++代码实现了一个基于顺序表的动态数组数据结构,提供了一系列的操作,包括初始化、销毁、检查空、获取长度、插入、删除、查找元素和打印顺序表。以下是对代码的详细解析:

  1. 头文件和命名空间

    • 包含 <iostream><cstdio><cstdlib> 头文件。
    • 使用 using namespace std; 来避免在标准库类型和函数前加 std::
  2. 宏定义

    • OKERROROVERFLOW 分别定义了操作成功、失败和内存溢出的状态码。
  3. 数据类型和结构体定义

    • Status 用作函数返回值类型,表示操作的状态。
    • ElemType 定义了顺序表中元素的数据类型,这里设为 int
    • MAXSIZE 定义了顺序表可能达到的最大长度。
    • SqList 结构体定义了顺序表,包含一个指向元素数组的指针 elem 和一个表示当前长度的整数 length
  4. 顺序表初始化函数 InitList

    • 分配一个大小为 MAXSIZE 的数组空间给顺序表,并初始化长度为0。
  5. 顺序表销毁函数 DestroyList

    • 释放顺序表使用的存储空间。
  6. 获取顺序表长度函数 ListLength

    • 返回顺序表的长度。
  7. 检查顺序表是否为空函数 ListEmpty

    • 如果顺序表长度为0,返回1,表示空;否则返回0,表示非空。
  8. 获取元素函数 GetElem

    • 根据给定的位置 i 获取元素 e。如果位置不合法,返回 ERROR
  9. 查找元素函数 LocateElem

    • 查找元素 e 在顺序表中的位置,如果找到返回位置加1,否则返回0。
  10. 插入元素函数 ListInsert

    • 在顺序表的指定位置 i 插入元素 e。如果插入位置不合法或存储空间已满,返回 ERROR
  11. 删除元素函数 ListDelete

    • 删除顺序表中指定位置 i 的元素。如果位置不合法,返回 ERROR
  12. 打印顺序表函数 ListPrint

    • 遍历顺序表并打印所有元素。
  13. 主函数 main

    • 初始化顺序表。
    • 循环读取操作指令,支持 “Empty”、“Insert”、“Length”、“GetElem”、“LocateElem” 和 “Delete”。
    • 根据指令执行相应操作,并处理可能的错误情况。
    • 销毁顺序表并释放内存。
  14. 程序结束

    • 输入结束后,程序返回0,表示正常结束。

代码逻辑分析

  • 这段代码通过封装一系列操作顺序表的函数,实现了对顺序表的基本操作。
  • 使用了动态内存分配和释放,需要注意内存管理以避免内存泄漏。

潜在问题

  • InitList 函数中,如果内存分配失败,则直接 exit(OVERFLOW),这可能导致程序异常退出。
  • ListEmpty 函数返回值与宏定义的状态码不匹配,应返回 OK(非0)表示真,ERROR(0)表示假。

改进建议

  • 考虑使用异常处理来替代 exitInitList 中处理内存分配失败的情况。
  • 统一 ListEmpty 函数的返回值,使其与宏定义的状态码一致。
  • main 函数中,添加对输入操作的验证,确保它们是预期的指令之一。
  • 考虑使用 std::vector 来自动管理内存,简化代码并减少内存管理的复杂性。

AC代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型#define MAXSIZE 100 //顺序表可能达到的最大长度typedef struct {ElemType *elem; //存储空间的基地址int length; //当前长度
} SqList;Status InitList(SqList &L)   //算法2.1 顺序表的初始化
{//构造一个空的顺序表LL.elem = new ElemType[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间if(!L.elem)exit(OVERFLOW); //存储分配失败退出L.length = 0; //空表长度为0return OK;
}
void DestroyList(SqList &L)
{if(L.elem)delete []L.elem;     //释放存储空间
}int ListLength(SqList L)
{return L.length ;
}
bool ListEmpty(SqList L)
{if(L.length ==0)return 1;else return 0;
}
Status GetElem(SqList L, int i, ElemType & e)   //算法2.2 顺序表的取值
{if(i<1||i>L.length )return ERROR;//判断i值是否合理,若不合理,返回ERROR e=L.elem[i-1];//elem[i-1]单元存储第i个数据元素 return OK;
}
int LocateElem(SqList L, ElemType e)   //算法2.3 顺序表的查找
{for(int i=0;i<L.length ;i++)if(L.elem[i]==e)return i+1;//查找成功,返回序号i+1 return 0; //查找失败,返回0 
}
Status ListInsert(SqList &L, int i, ElemType e)   //算法2.4 顺序表的插入
{/****在此下面完成代码***************/int j;if((i<1)||(i>L.length+1 )){return ERROR;}if (L.length==MAXSIZE) return ERROR;for(j=L.length-1;j>=i-1;j--){L.elem [j+1]=L.elem [j];}L.elem [i-1]=e;++L.length;return OK;/***********************************/
}
Status ListDelete(SqList &L,int i){if(i<1||i>L.length) return ERROR;   //i值不合法for (int j=i;j<=L.length-1;j++)L.elem[j-1]=L.elem[j]; //被删除元素之后的元素前移  --L.length;                       //表长减1return OK;
}
void ListPrint(SqList L)
{for(int i = 0; i < L.length; i++)cout << L.elem[i] << ((i == L.length - 1) ? '\n' : ' ');
}
int main()
{int i;ElemType e;SqList L;string op;InitList(L);while(cin >> op) {if(op == "Empty")cout << (ListEmpty(L) ? "Empty" : "Not empty") << endl;else if(op == "Insert") {cin >> i >> e;if(ListInsert(L, i, e) == ERROR)cout << "Insert failed" << endl;elseListPrint(L);} else if(op == "Length") {cout << "List length is " << ListLength(L) << endl;} else if(op == "GetElem") {cin >> i;if(GetElem(L, i, e) == ERROR)cout << "Out of index" << endl;elsecout << "The elem at position " << i << " is " <<  e << endl;} else if(op == "LocateElem") {cin >> e;i = LocateElem(L, e);if(i == 0)cout << e << " is not found in list" << endl;elsecout << e  << " is found at the position " << i << endl;} else if(op == "Delete") {cin >> i;if(ListDelete(L, i) == ERROR)cout << "Delete failed" << endl;elseListPrint(L);}}DestroyList(L);return 0;
}

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

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

相关文章

已成功与服务器建立连接,但是在登录过程中发生错误。(provider: SSL提供程序,error:0-证书链是由不受信任的颁发机构颁发的。)

已成功与服务器建立连接&#xff0c;但是在登录过程中发生错误。(provider: SSL提供程序,error:0-证书链是由不受信任的颁发机构颁发的。) 在连接SQL Server2008R2数据库时发生错误。 连接字符串&#xff1a;server127.0.0.1;uidsa;pwd1;databasedb; 解决办法&#xff1a; 方…

PySide(PyQt)在图像上画线

1、按鼠标左键任意画线 import sys from PySide6.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget from PySide6.QtGui import QPainter, QPixmap, QMouseEvent, QColor, QPen from PySide6.QtCore import Qt, QPointclass PaintLabel(QLabel):def __init__(self…

如何使用FlowUs打造爆款自媒体内容?内容资产管理沉淀的先进工具选息流

FlowUs 是一款流行的在线协作工具&#xff0c;它以其灵活的块编辑器、看板视图、数据库管理等功能受到众多个人和团队的喜爱。将其应用于内容资产管理&#xff0c;尤其是对于追求打造爆款自媒体的创作者而言&#xff0c;可以极大地提升内容创作、组织、分发及分析的效率。 内容…

无刷直流电机(BLDCM)仿真建模

无刷直流电机&#xff0c;即BLDCM在各个行业应用非常广泛。在汽车电子领域&#xff0c;BLDCM被广泛用于电动汽车、混合动力汽车、电动自行车等车辆的驱动系统中。由于BLDCM具有高效率、高力矩密度和快速响应的优势&#xff0c;它可以提供可靠的动力输出&#xff0c;并且可以通过…

JavaScript 动态网页实例 —— 背景效果

页面背景是网页设计中必不可少的重要内容之一,其背景的好坏直接影响网页浏览者的浏览兴趣。网页背景分为背景图和背景色两种,对于普通的背景图和背景色,完全可以通过HTML实现,而要实现复杂的背景效果,则需要借助于JavaScript。本章介绍页面背景的一些实现效果。首先是一个…

idea常用配置 | 快捷注释

idea快速注释 一、类上快速注释 &#xff08;本方法是IDEA环境自带的&#xff0c;设置特别方便简单易使用&#xff09; 1、偏好设置->编辑器->文件和代码模版 | File-Settings-Editor-File and Code Templates 2、右下方的“描述”中有相对应的自动注注释配置格式 贴…

力扣 单词规律

所用数据结构 哈希表 核心方法 判断字符串pattern 和字符串s 是否存在一对一的映射关系&#xff0c;按照题意&#xff0c;双向连接的对应规律。 思路以及实现步骤 1.字符串s带有空格&#xff0c;因此需要转换成字符数组进行更方便的操作&#xff0c;将字符串s拆分成单词列表…

Java单体架构项目_云霄外卖-特殊点

项目介绍&#xff1a; 定位&#xff1a; 专门为餐饮企业&#xff08;餐厅、饭店&#xff09;定制的一款软件商品 分为&#xff1a; 管理端&#xff1a;外卖商家使用 用户端&#xff08;微信小程序&#xff09;&#xff1a;点餐用户使用。 功能架构&#xff1a; &#xff08…

Python学习笔记20:进阶篇(九)常见标准库使用之sys模块和re模块

前言 本文是根据python官方教程中标准库模块的介绍&#xff0c;自己查询资料并整理&#xff0c;编写代码示例做出的学习笔记。 根据模块知识&#xff0c;一次讲解单个或者多个模块的内容。 教程链接&#xff1a;https://docs.python.org/zh-cn/3/tutorial/index.html 错误输出…

电商平台数据爬取经验分享

一、引言 在电商领域&#xff0c;数据的重要性不言而喻。无论是市场趋势分析、竞争对手研究&#xff0c;还是用户行为洞察&#xff0c;都离不开数据的支持。而数据爬虫作为获取这些数据的重要工具&#xff0c;其技术的掌握和运用对于电商平台来说至关重要。本文将结合个人实际…

AI绘画 Stable Diffusion【实战进阶】:图片的创成式填充,竖图秒变横屏壁纸!想怎么扩就怎么扩!

大家好&#xff0c;我是向阳。 所谓图片的创成式填充&#xff0c;就是基于原有图片进行扩展或延展&#xff0c;在保证图片合理性的同时实现与原图片的高度契合。是目前图像处理中常见应用之一。之前大部分都是通过PS工具来处理的。今天我们来看看在AI绘画工具 Stable Diffusio…

架构师篇-7、企业安全架构设计及实践

摘要&#xff1a; 认识企业安全架构企业安全案例分析及实践 内容&#xff1a; 为什么做企业安全架构怎么做好安全架构设计案例实践分析&随堂练 为什么要做企业安全架构 安全是麻烦制造者&#xff1f; 整天提安全需求增加开发工作增加运维要求增加不确定性延后业务上线…

[C++][设计模式][适配器模式]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受 1.动机 在软件系统中&#xff0c;由于应用环境的变化&#xff0c;常常需要将”一些现存的对象“放在新的环境中应用&#xff0c;但是新环境要求的接口是这些现存对象所不满足如何应对这些”迁移的变化“&#xff1f;如何既能利用现…

【单片机毕业设计选题24038】-基于STM32的木材厂环境监测系统

系统功能: 系统上电后根据采集到的传感器值自动控制&#xff0c;温度过高后自动开启风扇通风降温&#xff0c;湿度过 高后自动开启风扇除湿&#xff0c;光照过低后自动开启补光&#xff0c;雨量过高蜂鸣器报警&#xff0c;火焰传感器检 测到火灾后蜂鸣器报警并打开水泵灭火。…

20240629在飞凌的OK3588-C开发板的Linux R4系统下使用i2cdetect确认I2C总线

rootok3588:/# i2cdetect -y -r 0 rootrk3588-buildroot:/# i2cdetect -l rootrk3588-buildroot:/# i2cdetect -F 0 20240629在飞凌的OK3588-C开发板的Linux R4系统下使用i2cdetect确认I2C总线 2024/6/29 15:37 在CAM1、CAM2挂载OV13850。 在CAM3、CAM4和CAM5挂载OV5645了。 in…

Spring-循环依赖是如何解决的

1、bean被创建保存到spring容器的过程 1、实例化 -> 获取对象&#xff1b; 2、填充属性&#xff1b;这里可能需要依赖其它的bean。 3、AOP代理对象替换&#xff1b; 4、加入单例池&#xff1b; 问题&#xff1a; 循环依赖怎么处理 ServiceA 中有属性ServiceB b&#…

phpMyAdmin | mysqli::real_connect(): (HY000/2002): No such file or directory

法一&#xff1a;第一次安装宝塔 第一次安装宝塔mysql服务是默认关闭的&#xff0c;需要手动打开&#xff0c;打开服务再次进入phpMyAdmin发现可以进入了 法二&#xff1a;第一种方法没解决用这种 出现mysqli::real_connect(): (HY000/2002): No such file or directory错误通…

【数据结构|C语言版】四大排序(算法)

前言1. 插入排序1.1 直接插入排序1.2 希尔排序 2. 选择排序2.1 选择排序2.2 堆排序 3. 交换排序3.1 冒泡排序冒泡排序的步骤 3.2 快速排序快速排序的步骤 4. 归并排序归并排序的步骤&#xff1a;代码解释&#xff1a;归并排序的性能&#xff1a; 上期回顾: 【数据结构|C语言版】…

Python项目开发实战:影视作品分析小程序,案例教程编程实例课程详解

在构建一个影视作品分析小程序时,我们将会涉及到多个方面,包括项目规划、需求分析、设计、开发、测试以及部署等。以下是一个简化的指南,用于实战Python项目开发——一个影视作品分析小程序。 一、项目规划和需求分析 1. 项目背景和目标 随着影视行业的快速发展,观众对于影…

kubuadm 方式部署 k8s 集群

准备三台机器 主机名IP地址CPU/内存角色K8S版本Docker版本k8s231192.168.99.2312C4Gmaster1.23.1720.10.24k8s232192.168.99.2322C4Gwoker1.23.1720.10.24k8s233192.168.99.2332C4Gwoker1.23.1720.10.24 需要在K8S集群各节点上面安装docker&#xff0c;如未安装则参考 …