实验二-写一个主程序来上机设计并验证线性表顺序表示的所有操作(至少包含算法2.3、2.4、2.5),并设计一个算法删除所有值大于min而且小于max的元素。

废话不多说,数据结构自己写代码见识了太多的bug,看来还是自己写代码的功夫不到家啊,进入正题。直接上代码。

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef struct {ElemType *elem;int length;
}SqList;
//算法2.3 构造一个空的线性表
bool InitList_Sq(SqList &L)
{L.elem=new ElemType[MAXSIZE];if(!L.elem)return false;L.length=0;return true;
}
//给顺序表赋值
void Set_SqList(SqList &L)
{int num;int i=-1;printf("Please enter some numbers,then enter 9999 to end.\n");while (scanf("%d",&num)){if(num==9999)break;L.elem[++i]=num;L.length++;}printf("Successfully set SqList.\n");printf("Your SqList is:\n");for(int i=0;i<L.length;i++)printf("%d ",L.elem[i]);printf("\n");
}
//算法2.4
ElemType ListInsert_Sq(SqList &L, int i, ElemType e) 
{ // 在顺序线性表L的第i个位置之前插入新的元素e// i的合法值为1<=i<=ListLength_Sq(L) + 1if(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;
}
//  算法2.5
ElemType ListDelete_Sq(SqList &L,int i,ElemType &e)
{	// 在顺序线性表L中删除第i个元素, 并用e返回其值// i的合法值为1<=i<=ListLength_Sq(L)if((i<1)||(i>L.length))return ERROR;e=L.elem[i-1];for(int j=i;j<L.length;j++){L.elem[j-1]=L.elem[j];}--L.length;return OK;
}//算法 找Max
ElemType FindMax(SqList L)
{int Max=L.elem[0];for(int i=0;i<L.length;i++){if(L.elem[i]>Max)Max=L.elem[i];}return Max;
}
//算法 找Min
ElemType FindMin(SqList L)
{int Min=L.elem[0];for(int i=0;i<L.length;i++){if(L.elem[i]<Min){Min=L.elem[i];}			}return Min;
}
//算法 删除所有值大于min而且小于max的元素
void DeleteNumbers(SqList &L,ElemType Max,ElemType Min)
{ElemType element;int k=0;while(k<=L.length-1){	//当k>L.length-1时,说明删完了if(L.elem[k]>Min && L.elem[k]<Max){ListDelete_Sq(L,k+1,element);	//K是数组下标,而删除的是以1开头的下标,所以加1}else{k++;}}for(int i=0;i<L.length;i++)printf("%d ",L.elem[i]);printf("\n");
}
int main()
{SqList L;	//构造一个线性表ElemType ret;ret=InitList_Sq(L);	//构造一个空的线性表,并把返回值给retif(ret){printf("Successfully initialized SqList.\n");}elseprintf("Failed initialized SqList.\n");	Set_SqList(L);		//给表赋值printf("What a number do you want to insert?\n");int number;scanf("%d",&number);printf("Where do you want to insert it?\n");int position;scanf("%d",&position);ret=ListInsert_Sq(L,position,number);if(ret){printf("Successfully insert SqList.\n");printf("After inserting,your SqList is:\n");for(int i=0;i<L.length;i++)printf("%d ",L.elem[i]);printf("\n");}elseprintf("Failed insert SqList.\n");printf("Which element in the SqList do you want to delete?\n");int position2;scanf("%d",&position2);ElemType element;ret=ListDelete_Sq(L,position2,element);if(ret){printf("Successfully delete SqList.\n");printf("The element you delete is: %d\n",element);printf("After deletting,your SqList is:\n");for(int i=0;i<L.length;i++)printf("%d ",L.elem[i]);printf("\n");	}elseprintf("Failed delete SqList.\n");ElemType Max=FindMax(L);	//最大值printf("The max number is: %d\n",Max);ElemType Min=FindMin(L);	//最小值printf("The min number is: %d\n",Min);printf("After delete the numbers between min and max,then the SqList is:\n");DeleteNumbers(L,Max,Min);return 0;/*Sample Input:0 1 2 3 4 5 4 3 2 1 0 1 2 3 4 5 4 3 2 1 0*/
}

输出 

Successfully initialized SqList.
Please enter some numbers,then enter 9999 to end.
0 1 2 3 4 5 4 3 2 1 0 1 2 3 4 5 4 3 2 1 0
9999
Successfully set SqList.
Your SqList is:
0 1 2 3 4 5 4 3 2 1 0 1 2 3 4 5 4 3 2 1 0
What a number do you want to insert?
9999
Where do you want to insert it?
1
Successfully insert SqList.
After inserting,your SqList is:
9999 0 1 2 3 4 5 4 3 2 1 0 1 2 3 4 5 4 3 2 1 0
Which element in the SqList do you want to delete?
1
Successfully delete SqList.
The element you delete is: 9999
After deletting,your SqList is:
0 1 2 3 4 5 4 3 2 1 0 1 2 3 4 5 4 3 2 1 0
The max number is: 5
The min number is: 0
After delete the numbers between min and max,then the SqList is:
0 5 0 5 0--------------------------------
Process exited after 14.98 seconds with return value 0
请按任意键继续. . .

 

让我折腾了不少时间的bug就是——删除所有值大于min而且小于max的元素  的实现。删除顺序表中的元素,直接调用ListDelete_Sq()函数,既然是删除所有值大于min而且小于max的元素,那就需要遍历出所有值大于min而且小于max的元素。既然是遍历,自然会想到用for循环了,用for循环时,删除算法执行后,应该 i--;因为删除元素后,后面的元素移动到当前位置来了,需要再次判是否符合删除条件,如果符合,i才能++。也可以用while()循环,while循环的做法需要增加一条语句,if   else   。if()里面的条件成立,执行删除算法。如果不成立,下标i需要++。

还有一点需要注意的是,循环的终止条件是什么,中止条件就是,当下标+1>Length后才能中止,不能是>=,大于等于可能会漏掉最后一个不符合条件的数。

还有一点,就是删除所有值大于min而且小于max的元素的判断条件应该怎么写。应该是

L.elem[k]>Min && L.elem[k]<Max

或者

L.elem[k]!=Min && L.elem[k]!=Max

不能用或——||   !!!

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

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

相关文章

维修住友注塑机 Sumitomo SE50D 工业液晶屏 SE50S工业电脑显示屏

Sumitomo (SHI) Demag 的 NC5 plus 控制器是一款易于使用的控制器&#xff0c;可帮助成型商实现卓越的注塑成型精度。 该控制器作为用户和注塑机之间的通信接口发挥着关键作用。只有通过控制才能访问机器的全部性能属性&#xff0c;从而以各种方式帮助最大限度地提高生产效率。…

1688商品详情数据采集(商品属性,规格,价格,详情图等)

京东商品详情数据采集是一个复杂但重要的过程&#xff0c;它涉及获取商品的详细信息&#xff0c;包括商品属性、规格、价格以及详情图等。以下是关于如何进行京东商品详情数据采集的基本步骤&#xff1a; 确定采集目标&#xff1a;首先&#xff0c;你需要明确需要采集的商品信…

tcp 连接数上限突破

连接数上限条件 文件句柄的限制 一个tcp连接就需要占用一个文件描述符&#xff0c;一旦文件描述符用完&#xff0c;新的连接就会返回给我们错误是&#xff1a;Can’topen so many files。linux系统出于安全角度的考虑&#xff0c;在多个维度对于可打开的文件描述符进行了限制…

unityAB包管理(远程下载)

1.AB包生成脚本 using UnityEngine; using UnityEditor; using System.IO; using System; using System.Collections.Generic;/// <summary> /// AB包创建 /// </summary> public class CreateAssetBundles : MonoBehaviour {public static string BuildAssetBund…

ARM 汇编指令:(五)CMP指令

目录 1.CMP比较指令 2.指令条件码 cond 1.CMP比较指令 CMP指令是计算机指令集中的一种比较指令&#xff0c;用于比较两个操作数的大小关系或相等性&#xff0c;并根据比较结果设置或更新条件码寄存器&#xff08;或程序状态字&#xff09;的标志位。 指令格式&#xff1a;C…

VUE内盘期货配资软件源码国际外盘二合一

开发一个Vue内盘期货配资软件源码&#xff0c;同时兼容国际外盘二合一的功能&#xff0c;是一个复杂且专业的任务&#xff0c;涉及前端Vue.js框架的使用、后端服务器处理、数据库管理、实时交易接口对接等多个方面。下面是一些关于开发此类软件的基本指导和考虑因素&#xff1a…

富格林:洞悉暗箱手法可信策略远离

富格林悉知&#xff0c;在现货黄金中&#xff0c;揭秘很多投资者都是奔着盈利来的&#xff0c;因此学习正规盈利出金技能是必不可少的。但一些投资者在进入市场后并不注意技能的提升&#xff0c;只是一味的看中盈利&#xff0c;这样的做单导致被诱导暗箱亏损的不少&#xff0c;…

什么是同城上门预约按摩系统,上门预约平台有哪些功能?

随着互联网技术的发展&#xff0c;人们的生活方式发生了很大的变化。在日常生活中&#xff0c;大家都习惯使用手机来订餐、购物、家政服务等&#xff0c;这也为我们的生活带来了很大的便利。而同城按摩小程序作为一种新兴的按摩预约方式&#xff0c;受到了越来越多人的欢迎。下…

轻松上手MacOS:HomeBrew安装全指南

轻松上手MacOS&#xff1a;HomeBrew安装全指南 你是否曾为在MacOS上安装软件而烦恼&#xff1f;是否想要一个既强大又简单的包管理器来简化你的安装过程&#xff1f;HomeBrew正是你所需要的工具。作为MacOS上的包管理器&#xff0c;HomeBrew让安装软件变得像数123一样容易。在…

机器视觉检测设备的组成要素

机器视觉检测设备是一种先进的自动化检测技术工具&#xff0c;它利用光学、图像处理和计算机硬件及软件技术模拟并扩展人类的视觉功能&#xff0c;以实现对产品或目标物体进行自动化的尺寸测量、缺陷检测、表面质量评估、颜色识别、形状匹配以及位置判断等功能。这种设备通常包…

GettingStartedwithLLVMCoreLibraries书籍

Getting Started with LLVM Core Libraries 参考1 LLVM是构架编译器(compiler)的框架系统&#xff0c;以C编写而成&#xff0c;用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time)&#xff0c;对开…

c/c++| 常规 |sizeof 、strlen

总结来说 &#xff0c;sizeof 查看内存给对象分配的空间大小&#xff0c;不仅仅是普通的内置变量&#xff0c;还包括用户自定义变量、结构体、类对象 然后strlen 是查看字符串的实际长度大小&#xff0c;注意它不会计算那个结束符’\0’

重生奇迹MU攻击防御技能石哪里掉

在《重生奇迹MU》中&#xff0c;攻击和防御技能石可以从以下途径获得&#xff1a; 1.怪物掉落&#xff1a;你可以通过击败怪物获得攻击和防御技能石&#xff0c;不同的怪物掉落不同的石头。你可以在各个地图的怪物掉落表中查看特定怪物掉落的技能石。 2.商店购买&#xff1a;…

【教程】APP加固的那些小事

摘要 APP加固是保护APP代码逻辑的重要手段&#xff0c;通过隐藏、混淆、加密等操作提高软件的逆向成本&#xff0c;降低被破解的几率&#xff0c;保障开发者和用户利益。本文将介绍APP加固常见失败原因及解决方法&#xff0c;以及处理安装出现问题的情况和资源文件加固策略选择…

eclipse报: cvc-elt.1: Cannot find the declaration of element

eclipse报: cvc-elt.1: Cannot find the declaration of element 这个错误通常出现在XML文件中&#xff0c;它表示XML解析器在尝试解析XML文件时找不到某个元素的声明。这通常是因为XML文件引用的DTD&#xff08;文档类型定义&#xff09;或XSD&#xff08;XML Schema定义&…

怎么查看电脑是不是固态硬盘?简单几个步骤判断

随着科技的发展&#xff0c;固态硬盘&#xff08;Solid State Drive&#xff0c;简称SSD&#xff09;已成为现代电脑的标配。相较于传统的机械硬盘&#xff0c;固态硬盘在读写速度、稳定性和耐用性等方面都有显著优势。但是&#xff0c;对于不熟悉电脑硬件的用户来说&#xff0…

3D地图在BI大屏中的应用实践

前言 随着商业智能的不断发展&#xff0c;数据可视化已成为一项重要工具&#xff0c;有助于用户更好地理解数据和分析结果。其中&#xff0c;3D地图作为一种可视化工具&#xff0c;已经在BI大屏中得到了广泛地应用。 3D地图通过将地理信息与数据相结合&#xff0c;以更加直观…

3. git 回退代码版本

在Git中&#xff0c;如果你想要将某个分支的代码回退到上一个版本&#xff0c;你可以使用 git revert 或者 git reset 命令。 这两个命令有不同的用途和效果&#xff0c;因此你需要根据你的具体需求来选择合适的命令。 使用 git revert git revert 命令用于创建一个新的提交&…

【Linux】Shell编程【一】

shell是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问操作系统内核的服务。 Shell属于内置的…

【C++ 学习】程序内存分布

文章目录 1. C 内存分布的引入 1. C 内存分布的引入 ① 栈又叫堆栈&#xff1a;非静态局部变量/函数参数/返回值等等&#xff0c;栈是向下增长的。 ② 内存映射段&#xff1a;是高效的I/O映射方式&#xff0c;用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存…