C++ (数据结构)基于顺序表的有关操作

实验2、基于顺序表的非递减有序表的合并
(1)实验目的
通过该实验,深入理解顺序表的逻辑结构、物理结构等概念,掌握顺序表基本操作的编程实现,注意顺序表插入、删除等操作过程中数据元素的移动现象,培养学生编写程序时,要考虑程序的健壮性,全面考虑问题,熟练掌握通过函数参数返回函数结果的办法。
(2)实验内容
编程实现顺序表下教材第二章定义的线性表的基本操作,并根据已经实现的基本操作,实现两个非递减有序的线性表的合并,注意,合并时,如果有重复的元素,请保留一个。
(3)实验要求
(a)求前驱是指,输入一个元素值(而不是位置),求该元素在顺序表中的直接前驱元素值。求后继是指:输入一个元素值(而不是位置),求该元素在顺序表中的直接后继元素值;(b)为了方便修改数据元素的类型,请使用类型重定义,可以方便修改线性表中的数据元素的类型;(c)大部分函数的返回结果应是函数执行是否成功的一种状态,执行成功了,才返回具体的结果值;(d)对每个功能进行测试时,要求把不合法的情况也测试一下。具体见下面的测试用例;(e)采用菜单形式对应各个操作,使其编成一个完整的小软件,参考界面如下。

注:销毁是指free(L.elem); L.elem=NULL; L.length=0; L.listsize=0; return TRUE。清空是指:L.length=0 ;return TRUE。
(3)验收/测试用例
通过菜单调用各个操作,测试点:
 没有初始化前进行其他操作,程序是否能控制住;即,如果没有初始化线性表,其他的功能是无法正常进行的,如果选择进行其他操作,要提示先进行初始化;
 初始化一个顺序表(初始化顺序表,是指初始化一个空的线性表,里面的元素个数是0);
 插入数据(位置, 数据),要测插入位置不合法的情况(0,1)、(2,1),正确插入3个数据(1,20)、(1,10)、(3,30);
 显示顺序表中的数据,屏幕输出10, 20, 30;
 判空,屏幕输出顺序表非空;
 输出顺序表长度,屏幕输出3;
 获取指定位置元素,要测指定位置在【1,3】范围之外的情况和之内的情况;
 定位,输入:40, 输出:不存在,输入20,输出位置为2;
 求直接前驱,要测求第一个元素的前驱、不存在顺序表中的元素的直接前驱,其他元素的直接前驱;输入10,输出:第一个元素没有前驱,输入20,输出前驱是10,输入40,输出该元素不存在;
 求直接后继,要测最后一个元素的后继、不存在顺序表中的元素的直接后继,其他元素的直接后继;同上求前驱;
 删除,要测位置在【1,3】范围之外的情况和之内的情况;
 清空操作后再测长度,判断是否为空;
 销毁顺序表,销毁线性表之后还能不能做插入,删除等操作,如果选其他操作,就要提示线性表已经销毁不存在;
 测试合并操作,第一个线性表中的元素是(2,3,4,5),第二个线性表中的内容是(1,4,5,6,7),合并后的结果,请输出。
在这里插入图片描述


此代码参照严蔚敏数据结构中的伪代码,详情请自行查看

 #include<iostream>
#include<cstdlib>
using namespace std;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OVERFLOW       -1
int a_ok=0;//全局变量,判断空间申请是否成功 
int b_ok=0;
int c_ok=0;

typedef int ElemType;
typedef struct{
   
	ElemType *elem;
	int length;
	int listsize;
}SqList;

//初始化线性表
void InitList_Sq(SqList &L) {
   
	L.elem=(ElemType*)malloc(LIST_INIT_SIZE *sizeof(ElemType));
	if(!L.elem){
   
		cout<<"初始化空间失败,请重新操作."<<endl;
		exit(OVERFLOW);
	} 
	L.length=0;
	L.listsize=LIST_INIT_SIZE;	
    cout<<"储存空间分配成功."<<endl;
    cout<<endl;
}

//销毁线性表 
void  Destroylist_Sq(SqList &L){
   
	free(L.elem);
	L.elem=NULL;
	if(!L.elem){
   
	cout<<"销毁成功";
}
	else {
   
		cout<<"销毁失败";
		exit(0);
	}
	cout<<endl;
}

//清空线性表
void ClearList_Sq(SqList &L){
   
	L.length=0;
	L.listsize=LIST_INIT_SIZE;
	cout<<"清空成功";
} 

//判断线性表是否为空
void EmptyList_Sq(SqList &L){
   
	if(L.length==0){
   
		cout<<"该线性表是空表." ;
	}
	else  cout<<"不是空表.";
	cout<<endl;
} 


//求线性表的长度
void GetLength_Sq(SqList &L){
   
	cout<<"表长为"<<L.length<<endl; 
	cout<<endl;
} 

//求指定位置元素的值 
void GetElem_Sq(SqList &L){
   
	int index;  //元素的位置 
	cout<<"请输入你想查询的元素位置:";
	cin>>index;
	if(index>0&&index<L.length+1){
   
		cout<<"你查询的元素为:"<<L.elem[index-1]<<endl;
	} 
	else cout<<"你输入的位置超出了表a的范围.";
	cout<<endl<<endl;
}

//根据元素的值来获取位置
void GetIndex_Sq(SqList &L){
   
	int g_elem;
	int index=0;
	cout<<"请输入你要查询的元素:";
	cin>>g_elem;
	for(int i=0;i<L.length;i++){
   
		if(g_elem==L.elem[i]){
   
			index=i+1;
			cout<<"该元素所在位置为:"<<index<<endl;
			return;
		}
	}
	cout<<"该表中不存在该元素.";
	cout<<endl;
} 

//求前驱
void  PriorElem_Sq(SqList &L){
   
	int index;
	cout
  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值