以下为实验内容:
1.实验性质:设计性实验
2.要求:
- 编程实现顺序表的以下基本操作:建立顺序表,修改顺序表,插入顺序表,删除顺序表。
- 采用顺序表结构编程实现:两个集合的运算:交集/并集/差集。
3.实验目的
通过该实验,深入理解顺序表的逻辑结构、物理结构等概念,掌握顺序表基本操作的编程实现,注意顺序表插入、删除等操作过程中数据元素的移动现象,学生编写程序时,要考虑程序的健壮性,熟练掌握通过函数参数返回函数结果的办法。
4.实验内容
编程实现顺序表下教材第二章定义的线性表的基本操作,最好用菜单形式对应各个操作,使其变成一个完整的小软件。
5.参考界面
6.验收/测试用例
通过菜单调用各个操作,测试点:
- 插入数据(位置, 数据),要测插入位置不合法的情况(0,1)、(2,1),正确插入4个数据(1,2)、(1,1)、(3,3);
- 显示顺序表中的数据,屏幕输出1, 2, 3;
- 判空,屏幕输出顺便表非空;
- 顺便表长度,屏幕输出3;
- 获取指定位置元素,要测指定位置在【1,3】范围之外的情况和之内的情况;
- 定位,输入:4, 输出:不存在,输入2,输出位置为2;
- 求直接前驱,要测求第一个元素的前驱、不存在顺序表中的元素的直接前驱,其他元素的直接前驱;
- 求直接后继,要测最后一个元素的后继、不存在顺序表中的元素的直接后继,其他元素的直接后继;
- 删除,要测位置在【1,3】范围之外的情况和之内的情况;
- 清空操作后再测长度;
下面是我的代码:
using namespace std;
#include <iostream>
#include<stdio.h>
#define ok 1
#define error 0
#define overflow -2
#define maxsize 10
typedef int status;
typedef struct //定义结构体
{
int *elem;
int length;
} sqList;
sqList L;//声明变量
void InitList(sqList &L);//顺序表的初始化
void ListLength(sqList &L); //顺序表的长度
void EmptyList(sqList &L);//判断顺序表是否为空
void ClearList(sqList &L);//顺序表的清空
void Illegal(sqList &L,int i);//判断输入的数字是否非法
void PointList(sqList &L,int i); //获取指定位置的顺序表元素
void BeforPoint(sqList &L,int i);//求顺序表的前驱
void AfterPoint(sqList &L,int i);//求顺序表的后继
void InsertList(sqList &L,int i,int x);//顺序表的插入
void InsertProcess(sqList &L,int i,int x);//在指定位置插入元素的过程
void DeleteList(sqList &L,int i);//删除指定位置的元素
void Display(sqList &L);//显示顺序表的数据
void Tips();//文字提示信息
int main()
{
Tips();//文字提示信息
InitList(L);//初始化线性表
// int condition; //获取函数返回的类型
int h,k;//分别用来获取输入的指定位置和插入数据的元素
int i;//输入的数字
cout<<"输入你要进行操作的相应数字:";
cin>>i;
while(true)
{
switch(i)//判断输入的i值
{
case 1:
ClearList(L);//清空顺序表
cout<<"输入你要进行操作的相应数字:";
cin>>i;
break;
case 2:
EmptyList(L);//判断顺序表是否为空
cout<<"输入你要进行操作的相应数字:";
cin>>i;
break;
case 3:
ListLength(L);//求顺序表的长度
cout<<"输入你要进行操作的相应数字:";
cin>>i;
break;
case 4:
cout<<"输入指定位置:";
cin>>h;
PointList(L,h);//获取顺序表指定位置的元素
cout<<"输入你要进行操作的相应数字:";
cin>>i;
break;
case 5:
cout<<"输入指定位置:";
cin>>h;
BeforPoint(L,h);//求前驱
cout<<"输入你要进行操作的相应数字:";
cin>>i;
break;
case 6:
cout<<"输入指定位置:";
cin>>h;
AfterPoint(L,h);//求后继
cout<<"输入你要进行操作的相应数字:";
cin>>i;
break;
case 7:
cout<<"输入指定位置:";
cin>>h;
cout<<"输入插入的数值:";
cin>>k;
InsertList(L,h,k);//在顺序表指定位置插入数据
cout<<"输入你要进行操作的相应数字:";
cin>>i;
break;
case 8:
cout<<"输入指定位置:";
cin>>h;
DeleteList(L,h);//在顺序表的指定位置删除数据
cout<<"输入你要进行操作的相应数字:";
cin>>i;
break;
case 9:
Display(L);//显示顺序表的元素
cout<<"输入你要进行操作的相应数字:";
cin>>i;
break;
case 10:
Tips();//提示信息
cout<<"输入你要进行操作的相应数字:";
cin>>i;
break;
default:
if(i <0)
return 0;
else
{
cout<<"输入数字非法,请重新输入:";
cin>>i;
}
break;
}
}
return 0;
}
void InitList(sqList &L)//顺序表的初始化
{
L.elem = new int(maxsize);
if(!L.elem)
cout<<"不能正确初始化"<<endl;
//return error;//exit(overflow);
L.length = 0;
}
void ListLength(sqList &L) //顺序表的长度
{
cout<<"顺序表的长度是:"<<L.length<<endl;
//return ok;
}
void EmptyList(sqList &L)//判断顺序表是否为空
{
if(L.length == 0)
{
cout<<"顺序表为空"<<endl;
}
else
{
cout<<"顺序表不为空"<<endl;
ListLength(L);//输出顺序表的长度
}
//return ok;
}
void ClearList(sqList &L)//顺序表的清空
{
if(L.length == 0)
{
cout<<"顺序表本身就是空表"<<endl;
//return error;
}
else
{
L.length = 0;
cout<<"顺序表已经清空了"<<endl;
//return ok;
}
}
void Illegal(sqList &L,int i)//判断输入的数字是否非法
{
cout<<"输入的数字非法"<<endl;
//return error;
}
void PointList(sqList &L,int i) //获取指定位置的顺序表元素
{
if(i<=0 || i>L.length)
{
Illegal(L,i);
//return error;
}
else
{
cout<<"指定位置的元素为:"<<L.elem[i-1]<<endl;
//return ok;
}
}
void BeforPoint(sqList &L,int i)//求顺序表的前驱
{
if(i<=0 || i>L.length)
{
Illegal(L,i);
//return error;
}
else if(i == 1)
{
cout<<"不存在前驱"<<endl;
}
else
{
cout<<"指定位置的前驱是:"<<L.elem[i-2]<<endl;
//return ok;
}
}
void AfterPoint(sqList &L,int i)//求顺序表的后继
{
if(i<=0 || i>L.length)
{
Illegal(L,i);
//return error;
}
else if(i == L.length)
{
cout<<"不存在后继"<<endl;
}
else
{
cout<<"指定位置的后继是:"<<L.elem[i]<<endl;
//return ok;
}
}
void InsertList(sqList &L,int i,int x)//顺序表的插入
{
if(i<=0 || i>L.length+1)
{
Illegal(L,i);
//return error;
}
else
{
InsertProcess(L,i,x);
}
}
void InsertProcess(sqList &L,int i,int x)//在指定位置插入元素的过程
{
/*for(int j=L.length;j>=i;j--)
{
if(j!=i)
{
int temp = L.elem[j-2];
L.elem[j-1] = temp;
}
}
L.elem[i-1] == x;
++L.length;
*/
for(int j=L.length-1; j>=i-1; j--)
L.elem[j+1]=L.elem[j];
L.elem[i-1]=x;
++L.length;
cout<<"插入元素成功"<<endl;
}
void DeleteList(sqList &L,int i)//删除指定位置的元素
{
if(i<=0 || i>L.length)
{
Illegal(L,i);
//return error;
}
else
{
for(int j=i; j<=L.length; j++)
{
if(j==i)
{
L.elem[j-1] = NULL;
}
else
{
L.elem[j-2] = L.elem[j-1];
}
}
--L.length;
cout<<"删除元素成功"<<endl;
}
}
void Display(sqList &L)//显示顺序表的数据
{
if(L.length == 0)
{
cout<<"顺序表为空表"<<endl;
}
else
{
cout<<"顺序表的元素是:";
for(int j=0; j<L.length; j++)
{
cout<<L.elem[j]<<",";
}
cout<<endl;
}
}
void Tips()//文字提示信息
{
cout << "1-----清空线性表" << endl;
cout << "2-----判断线性表是否为空" << endl;
cout << "3-----求线性表长度" << endl;
cout << "4-----获取线性表指定位置元素" << endl;
cout << "5-----求前驱" << endl;
cout << "6-----求后继" << endl;
cout << "7-----在线性表指定位置插入元素 "<< endl;
cout << "8-----删除空线性表指定位置元素" << endl;
cout << "9-----显示线性表" << endl;
cout << "10----显示提示信息"<< endl;
cout << " 退出,输入一个负数!" << endl;
}
下面是我的按照实验测试内容执行程序的运行图:
(1)插入数据(位置, 数据),要测插入位置不合法的情况(0,1)、(2,1),正确插入4个数据(1,2)、(1,1)、(3,3);
(2)显示顺序表中的数据,屏幕输出1, 2, 3;
(3判空,屏幕输出顺序表非空;
(4)顺序表长度,屏幕输出3;
(5)获取指定位置元素,要测指定位置在【1,3】范围之外的情况和之内的情况;定位,输入:4, 输出:不存在,输入2,输出位置为2;
(6)求直接前驱,要测求第一个元素的前驱、不存在顺序表中的元素的直接前驱,其他元素的直接前驱
(7)求直接后继,要测最后一个元素的后继、不存在顺序表中的元素的直接后继,其他元素的直接后继;
(8)删除,要测位置在【1,3】范围之外的情况和之内的情况;
(9)清空操作后再测长度;