实验性质:设计性实验
要求
编程实现顺序表的以下基本操作:建立顺序表,修改顺序表,插入顺序表,删除顺序表。
采用顺序表结构编程实现:两个集合的运算:交集/并集/差集。
实验目的
通过该实验,深入理解顺序表的逻辑结构、物理结构等概念,掌握顺序表基本操作的编程实现,注意顺序表插入、删除等操作过程中数据元素的移动现象,学生编写程序时,要考虑程序的健壮性,熟练掌握通过函数参数返回函数结果的办法。
实验内容
编程实现顺序表下教材第二章定义的线性表的基本操作,最好用菜单形式对应各个操作,使其变成一个完整的小软件。
参考界面
验收/测试用例
通过菜单调用各个操作,测试点:
-
插入数据(位置, 数据),要测插入位置不合法的情况(0,1)、(2,1),正确插入4个数据(1,2)、(1,1)、(3,3)
-
显示顺序表中的数据,屏幕输出1, 2, 3;
-
判空,屏幕输出顺便表非空;
-
顺便表长度,屏幕输出3;
-
获取指定位置元素,要测指定位置在【1,3】范围之外的情况和之内的情况;
-
定位,输入:4, 输出:不存在,输入2,输出位置为2;
-
求直接前驱,要测求第一个元素的前驱、不存在顺序表中的元素的直接前驱,其他元素的直接前驱;
-
求直接后继,要测最后一个元素的后继、不存在顺序表中的元素的直接后继,其他元素的直接后继;
-
删除,要测位置在【1,3】范围之外的情况和之内的情况;
-
清空操作后再测长度;
代码
#include <iostream>
#include <stdio.h>
using namespace std;
#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 PointList(SqList &L,int i); //获取指定位置的元素
void BeforList(SqList &L,int i); //求前驱
void AfterList(SqList &L,int i); //求后继
void InsertList(SqList &L,int i,int x);//顺序表的插入
void DeleteList(SqList &L,int i); //删除指定位置的元素
void Display(SqList &L); //显示顺序表的结构
void Postion(SqList &L,int i); //定位
void Menu(); //文字菜单提示信息
int main()
{
Menu();
InitList(L);
int h,k; //获取输入的指定位置和插入数据的元素
int i; //输入的数字
cout<<"请输入操作代码:";
cin>>i;
while(true)
{
switch(i)
{
case 1:
ClearList(L);
break;
case 2:
EmptyList(L);
break;
case 3:
ListLength(L);
break;
case 4:
cout<<"输入要操作的位置:";
cin>>h;
PointList(L,h);
break;
case 5:
cout<<"输入要操作的位置:";
cin>>h;
BeforList(L,h);
break;
case 6:
cout<<"输入要操作的位置:";
cin>>h;
AfterList(L,h);
break;
case 7:
cout<<"输入要操作的位置:";
cin>>h;
cout<<"输入要插入的值:";
cin>>k;
InsertList(L,h,k);
break;
case 8:
cout<<"输入要操作的位置:";
cin>>h;
DeleteList(L,h);
break;
case 9:
Display(L);
break;
case 10:
cout<<"输入要操作的值:";
cin>>k;
Postion(L,k);
break;
default:
if(i<0)
return 0;
else
{
cout<<"输入的位置非法,请重新输入";
break;
}
}
cout<<"请输入操作代码:";
cin>>i;
}
return 0;
}
void InitList(SqList &L)//初始化
{
L.elem = new int(MAXSIZE);
if(!L.elem)
cout<<"初始化有误"<<endl;
L.length=0;
}
void ListLength(SqList &L)//顺序表的长度
{
cout<<"顺序表的长度为"<<L.length<<endl;
}
void EmptyList(SqList &L)//判断顺序表是否为空
{
if(L.length==0)
cout<<"顺序表为空"<<endl;
else
{
cout<<"顺序表非空,长度为"<<L.length<<endl;
}
}
void ClearList(SqList &L)//清空顺序表
{
L.length=0;
cout<<"顺序表已清空"<<endl;
}
void PointList(SqList &L,int i)
{
if(i<=0||i>L.length)
{
cout<<"输入的数字非法"<<endl;
}
else
{
cout<<"第"<<i<<"个元素为"<<L.elem[i-1]<<endl;
}
}
void BeforList(SqList &L,int i)//求前驱
{
if(i<=0||i>L.length)
{
cout<<"输入数字非法"<<endl;
}
else if(i==1)
{
cout<<"第一个元素不存在前驱"<<endl;
}
else
{
cout<<"第"<<i<<"个元素的前驱为"<<L.elem[i-2]<<endl;
}
}
void AfterList(SqList &L,int i)//求后继
{
if(i<=0||i>L.length)
{
cout<<"输入数字非法"<<endl;
}
else if(i==L.length)
{
cout<<"最后一个元素不存在后继"<<endl;
}
else
{
cout<<"第"<<i<<"个元素的后继为"<<L.elem[i]<<endl;
}
}
void InsertList(SqList &L,int i,int x)//插入顺序表
{
if(i<=0||i>L.length+1)
{
cout<<"输入的位置非法"<<endl;
}
else
{
for(int j=L.length-1;j>=i-1;j--)
L.elem[j+1]=L.elem[j]; //从第i+1个元素开始都往后移一位
L.elem[i-1]=x; //第i个元素设为x
++L.length;
cout<<"插入元素成功"<<endl;
}
}
void DeleteList(SqList &L,int i)//删除指定元素
{
if(i<=0||i>L.length)
{
cout<<"输入的位置非法"<<endl;
}
else
{
for(int j=i;j<=L.length;j++)
{
L.elem[j-1]=L.elem[j]; //从第i+1个元素起依次往前移一个位置
}
--L.length;
cout<<"成功删除元素"<<endl;
}
}
void Display(SqList &L)//显示顺序表
{
if(L.length==0)
{
cout<<"当前顺序表为空表"<<endl;
}
else
{
cout<<"顺序表为:";
for(int j=0;j<L.length-1;j++)
{
cout<<L.elem[j]<<",";
}
cout<<L.elem[L.length-1];
cout<<endl;
}
}
void Postion(SqList &L,int i)
{
bool a = false;//判断是否能找到
for(int j=0;j<L.length;j++)
{
if(i==L.elem[j])
{
a=true;
cout<<"元素所在位置为:"<<j+1<<endl;
break;
}
}
if(!a)
cout<<"不存在"<<endl;
}
void Menu()
{
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;
}
写在最后
本文章仅供个人复习使用,如有错误,请联系我更正。