一、实验目的
1.熟悉顺序表基本操作顺序表的建立、插入、删除、查找
2.结构体的定义、自定义函数、宏定义
3.掌握线性表的顺序表示
4.会利用顺序表解决相关问题
二、实验任务
1.建立一个空顺序表;
2.空表中添加元素:你的身份证前10位数字,并打印输出线性表元素;
3.获取线性表中第3个元素,并打印输出该元素;
4.查找线性表中第一个与4相等的元素,并返回是否查找成功的标志或其位置;
5.在第7个位置插入一个你最喜欢的元素,并打印插入后线性表中的元素;
6.删除线性表中的第2个元素,并打印删除后线性表中的元素。
三、预习环节
1.结构体定义:
(1)struct 结构体名
{类型名 成员名1;
...
类型名 成员名n;
};
(2)struct 结构体名
{类型名 成员名1;
...
类型名 成员名n;
};
struct 结构体名 结构体变量名表;
(3)struct 结构体名
{类型名 成员名1;
...
类型名 成员名n;
};结构体变量名表
- 宏:宏是一种批量处理的称谓,根据一系列预定义的规则替换一定的文本模式
替换文本可以是常量或一些字符串
宏定义的优点是方便和易于维护。
- 输入: cin 是与流提取运算符>>结合使用的
cin>>name>>age;等价于 cin>>name;cin>>age;
- 输出:cout 是与流插入运算符<<结合使用的
cout<<”value of str is:”<<str<<endl;
四、实验内容
1、程序清单
#include<iostream>
using namespace std;
#define maxsize 100//默认初始化长度
#define OK 1
#define OVERFLOW 2
#define ERROR 0
typedef int Status;
typedef struct{
int *elem;
int length;
}SqList;
//建立一个空顺序表(动态分配)
Status InitList(SqList &L){
L.elem=new int[maxsize];
if(!L.elem)
{exit(OVERFLOW);}
else
{L.length=0;}
return OK;
}
//获取元素
Status GetElem(SqList L, int i, int &e)
{
if (i<1 || i>L.length) return ERROR;
e=L.elem[i-1];
return OK;
}
//查找
int LocateElem(SqList L,int e)//返回的是int类型
{
int i;
for(i=0;i<L.length;i++)
if(L.elem[i]==e) return i+1;
return 0;
}
//插入
Status ListInsert(SqList &L,int i,int e)
{
int j;
if ((i < 1) || (i >L.length+1)) return ERROR;
if (L.length==maxsize) return ERROR;
for (j=L.length-1; j>=i-1; j--)
L.elem[j+1]=L.elem[j];
L.elem[i-1]=e;
++L.length;
return OK;
}
//删除
Status ListDelete(SqList &L, int i)
{
int j;
if ((i < 1) || (i > L.length))
return 0;
for (j=i;j<=L.length-1;j++)
L.elem[j-1] = L.elem[j];
--L.length;
return OK;
}
//打印函数
int printlist(SqList &L)
{
int i;
for(i=0;i<L.length ;i++)
cout<<L.elem[i];
return L.elem[i];
}
int main()
{
SqList L;
InitList(L);
//建立空表
int i;int e;
L.length=10;
cout<<"添加元素"<<endl;
for(i=0;i<L.length;i++)
{
cin>>e;
L.elem[i]=e;
}
cout<<"输出线性表元素"<<endl;
for(i=0;i<L.length ;i++)
{
cout<<L.elem[i];
}
cout<<endl;
//输出线性表元素
cout<<"获取线性表中第i个元素"<<endl;
cout<<"输入i:";
cin>>i;
GetElem(L,i,e);
cout<<e<<endl;
//获取线性表中第i个元素
cout<<"查找第一个与x相等的元素"<<endl;
cout<<"输入x:";
int x;
cin>>x;
LocateElem(L,x);
cout<<LocateElem(L,x)<<endl;
//查找第一个与x相等的元素
cout<<"在第七个位置插入元素:a"<<endl;
cout<<"输入插入元素a:";
int a;
cin>>a;
ListInsert(L,7,a);
for(i=0;i<L.length ;i++)
{
cout<<L.elem[i];
}
cout<<endl;
//在第七个位置插入元素:a
cout<<"删除表中第n个元素"<<endl;
cout<<"输入n:";
int n;
cin>>n;
ListDelete(L,n);
for(i=0;i<L.length;i++)
{
cout<<L.elem[i];
}
//删除表中第n个元素
cout<<"运用创新定义函数printlist打印顺序表"<<endl;
printlist(L);
return 0;
}
2、程序调试过程
- 在定义函数实现查找操作时,一开始不会输出位置
解决:把函数返回值int类型
- 注意什么时候用 引用 什么时候不用。
- 注意合理范围 例如:在定义函数插入操作中,i值合法范围时1<=i<=L.length+1
- 能力提升
1.创建打印函数
//打印函数
int printlist(SqList &L)
{
int i;
for(i=0;i<L.length ;i++)
cout<<L.elem[i];
return L.elem[i];
}
六、总结与讨论
1.心得体会
(1)熟悉顺序表基本操作顺序表的建立、插入、删除、查找
(2)学会结构体的定义、自定义函数、宏定义
(3)掌握线性表的顺序表示 会利用顺序表解决相关问题
2.总结注意点
- 注意什么时候用 引用 什么时候不用。在形参表中,以“&”打头的参数即为引用参数。传递引用给函数与传递指针效果一样。形参变化实参也变化。
- 注意函数返回值类型
- 数据结构的表示(存储类型)用类型定义(typedef)描述;数据元素类型约定为ElemType,由用户在使用该数据类型时自行定义