1. 实验要求
- 编程实现顺序表的以下基本操作:建立顺序表,修改顺序表,插入顺序表,删除顺序表。
- 采用顺序表结构编程实现:两个集合的运算:交集/并集/差集。
2. 实验目的
通过该实验,深入理解顺序表的逻辑结构、物理结构等概念,掌握顺序表基本操作的编程实现,注意顺序表插入、删除等操作过程中数据元素的移动现象,学生编写程序时,要考虑程序的健壮性,熟练掌握通过函数参数返回函数结果的办法。
3. 实验内容
编程实现顺序表下教材第二章定义的线性表的基本操作,最好用菜单形式对应各个操作,使其变成一个完整的小软件。
4. 实验步骤
- 编写程序框架,利用while循环输入操作代码,利用switch选择语句对输入的代码进行判断,并进行相应操作。
- 编写各个操作的具体函数:
1>清空线性表:L.length = 0;
2>判断线性表是否为空:L.length是否等于0;
3>求线性表长度:L.length;
4>获取线性表指定位置元素:位置是否合法,L.elem[i-1];
5>求前驱:位置是否合法,L.elem[i-2];
6>求后继:位置是否合法,L.elem[i];
7>在线性表指定位置插入元素:位置是否合法,循环执行L.elem[i]= L.elem[i-1]语句 ,L.elem[i-1]=e;
8>删除线性表指定位置元素:位置是否合法,循环执行L.elem[i-1]= L.elem[i]语句;
9>显示线性表:for循环输出元素;
10>定位:for循环遍历元素,if判断是否存在要查找元素。
5. 实验数据测试
通过菜单调用各个操作,测试点:
- 插入数据(位置, 数据),要测插入位置不合法的情况(0,1)、(2,1),正确插入4个数据(1,2)、(1,1)、(3,3);
- 显示顺序表中的数据,屏幕输出1, 2, 3;
- 判空,屏幕输出顺便表非空;
- 顺便表长度,屏幕输出3;
- 获取指定位置元素,要测指定位置在【1,3】范围之外的情况和之内的情况;
- 定位,输入:4, 输出:不存在,输入2,输出位置为2;
- 求直接前驱,要测求第一个元素的前驱、不存在顺序表中的元素的直接前驱,其他元素的直接前驱;
- 求直接后继,要测最后一个元素的后继、不存在顺序表中的元素的直接后继,其他元素的直接后继;
- 删除,要测位置在【1,3】范围之外的情况和之内的情况;
- 清空操作后再测长度;
6. 实验代码
#include <iostream>
using namespace std;
typedef int ElemType;
#define MAXSIZE 100
typedef struct
{
ElemType *elem;//存储空间的基地址
int length; //当前长度,数据元素的个数
}SqList; //顺序表的结构类型为SqList
//初始化
void InitList(SqList &L);
//清空顺序表
void ClearList(SqList &L);
//判断线性表是否为空
void EmptyList(SqList &L);
//求线性表长度
void LenList(SqList &L);
//获取线性表指定位置元素
void ChooseList(SqList &L,int i);
//求前驱
void BeforeList(SqList &L,int i);
//求后继
void AfterList(SqList &L,int i);
//在线性表指定位置插入元素
void InsertList(SqList &L,int i,int j);
//删除线性表指定位置元素
void DeleteList(SqList &L,int i);
//显示线性表
void DisplayList(SqList &L);
//定位
void LocateList(SqList &L,int i);
int main()
{
SqList L;
InitList(L);
int i,j;
int index = 1;
while(index > 0)
{
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;
cout << "请输入操作代码:" << endl;
cin >> index;
switch(index)
{
case 1:
ClearList(L);
break;
case 2:
EmptyList(L);
break;
case 3:
LenList(L);
break;
case 4:
cout << "请输入你要获取的位置:";
cin >> i;
ChooseList(L,i);
break;
case 5:
cout << "请输入指定位置:";
cin >> i;
BeforeList(L,i);
break;
case 6:
cout << "请输入指定位置:";
cin >> i;
AfterList(L,i);
break;
case 7:
cout << "请输入要插入元素的位置:";
cin >> i;
cout << "请输入要插入的元素:";
cin >> j;
InsertList(L,i,j);
break;
case 8:
cout << "请输入要删除元素的位置:";
cin >> i;
DeleteList(L,i);
break;
case 9:
DisplayList(L);
break;
case 10:
cout << "请输入要定位元素的值:";
cin >> i;
LocateList(L,i);
break;
default:
cout << "输入数字不合法!" << endl;
}
cout << endl;
}
return 0;
}
void InitList(SqList &L)
{
L.elem = new ElemType[MAXSIZE];
if(!L.elem)
cout << "初始化失败!" << endl;
L.length = 0;
}
void ClearList(SqList &L)
{
if(L.length == 0)
cout << "线性表是空的!" << endl;
else
{
L.length = 0;
cout << "顺序表已经清空!" << endl;
}
}
void EmptyList(SqList &L)
{
if(L.length == 0)
cout << "线性表为空!" << endl;
else
cout << "线性表不为空!" << endl;
}
void LenList(SqList &L)
{
cout << "线性表的长度为:" << L.length << endl;
}
void ChooseList(SqList &L,int i)
{
if(i>0 && i<= L.length)
cout << L.elem[i-1] << endl;
else
cout << "你输入的位置不合法!" << endl;
}
void BeforeList(SqList &L,int i)
{
if(i>1 && i<=L.length)
cout << "指定位置前驱是:" << L.elem[i-2] << endl;
else if(i == 1)
cout << "该位置无前驱!" << endl;
else
cout << "输入位置不合法!" << endl;
}
void AfterList(SqList &L,int i)
{
if(i>0 && i<L.length)
cout << "该位置的后继是:" << L.elem[i] << endl;
else if(i == L.length)
cout << "该位置无后继!" << endl;
else
cout << "输入位置不合法!" << endl;
}
void InsertList(SqList &L,int i,int j)
{
if(i>0 && i<=L.length+1 && L.length < MAXSIZE)
{
for(int q=L.length;q>=i;q--)
L.elem[q] = L.elem[q-1];
L.elem[i-1] = j;
++L.length;
}
else
cout << "输入不合法!" << endl;
}
void DeleteList(SqList &L,int i)
{
if(i>0 && i<=L.length)
{
for(int k=i;k<L.length;k++)
L.elem[k-1] = L.elem[k];
--L.length;
}
else
cout << "输入位置不合法!" << endl;
}
void DisplayList(SqList &L)
{
if(L.length > 0)
for(int k=0;k<L.length;k++)
cout << L.elem[k] << " ";
}
void LocateList(SqList &L,int i)
{
bool isExit = false;
for(int k=0;k<L.length;k++)
{
if(L.elem[k] == i)
{
cout << "指定元素所在位置是:" << k+1 << endl;
isExit = true;
}
}
if(!isExit)
cout << "线性表中无此元素!" << endl;
}
7. 实验总结
- 判断表是否为空,清空表操作可直接利用表的length属性。
- 表的第一个元素无直接前驱,最后一个元素无直接后继。
- 对表进行插入操作时应注意插入位置的取值范围。进行插入操作时应由表尾开始操作。