《数据结构》实验二:
线性表综合实验
一.实验目的
巩固线性表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相关知识来解决具体问题。
二.实验时间
准备时间为第3周到第4周,具体集中实验时间为第4周第2次课。2个学时。
三..实验内容
1.建立一个由n个学生成绩的顺序表,n的大小由自己确定,每一个学生的成绩信息由自己确定,实现数据的对表进行插入、删除、查找等操作。分别输出结果。
要求如下:
1)用顺序表来实现。
2)用单链表来实现。
3)用双链表实现。
4)用静态链表实现。
5)用间接寻址实现。
分开写程序,可以一个方法分别写一博客文章上交作业。
2.实现两个集合的相等判定、并、交和差运算。要求:
1)自定义数据结构
2)自先存储结构,并设计算法。在VC中实现。
以上三题,第1题必须完成。第2和第3题可以作为选做题。
四.实验报告
1.在博客中先写上实习目的和内容,画出主要操作运算算法图,然后分别上传程序代码。插入调试关键结果截图。
2.单独写一个博文,比较总结线性表的几种主要存储结果。
五、实验心得
由于之前已经弄过有关顺序表的了,所以这次弄起来比上一次得心应手多了,但是由于知识还是不牢固,中间还是弄出了很多错误,所以就对着书修修改改,但是还是有很多错误找不到,顺序表应该算是这几个之间比较简单的了,但是还是弄得不成功,甚至还可以说是弄得最不好的一个了,不过有错误出现,才知道自己是哪里不行,没有掌握,我会通过这次实验找出自己的不足的,从而改进自己。
源代码如下:
#include<iostream>
#include<string>
using namespace std;
const int MaxSize=100;
bool error;
template<class DataType>//定义模板类
class SeqList
{
int i;
public:
SeqList(){length=0;} //无参构造函数
SeqList(DataType a[],int n);
~SeqList(){}
int Length(){return length;}//求线性表的长度
DataType Get(int i);//按位查找
int Locate(DataType x);//按值查找
void Insert(int i,DataType x);//插入
DataType Delete(int i);//删除
private:
DataType data[MaxSize];
int length;
};
template<class DataType>//有参构造函数
SeqList<DataType>::SeqList(DataType a[],int n)
{
if(n>MaxSize)throw"参数非法";
for(i=0;i<n;i++)
data[i]=a[i];
length=0;
}
template<class DataType>//按位查找
DataType SeqList<DataType>::Get(int i)
{
if(i<1&&i>length)throw"查找位置非法";
else return data[i-1];
}
template<class DataType>//按值查找
int SeqList<DataType>::Locate(DataType x)
{
for(i=0;i<length;i++)
if(data[i]==x)return i+1;
return 0;
}
template<class DataType>
void SeqList<DataType>::Insert(int i,DataType x)//插入
{ int j;
if(length>=MaxSize)throw"上溢";
if(i<1||1>length+1)throw"位置";
for(j=length;j>=i;j--)
data[j]=data[j-1];
data[i-1]=x;
length++;
}
template<class DataType> //删除
DataType SeqList<DataType>::Delete(int i)
{
int j,x;
if(length==0)throw"下溢";
if(i<1||i>length)throw"位置";
x=data[i-1];
for(j=i;j<length;j++)
data[j-1]=data[j];
length--;
return x;
}
int main()
{
cout<<"请选择你的想要的操作:\n"<<endl;
cout<<"<1> 录入学生成绩\n"<<endl;
cout<<"<2> 查找学生成绩\n"<<endl;
cout<<"<3> 插入学生成绩\n"<<endl;
cout<<"<4> 删除学生成绩\n"<<endl;
cout<<"<5> 退出\n\n"<<endl;
SeqList<int>List;
int flag,ins_loc,x,tab,len;
flag=0;
while (flag==0)
{
error=false;
cout<<"Please input the command:"<<endl;
cin>>tab;
switch(tab)
{
case 1:
{
int r[100],h,z;
cout<<"需要录入成绩的学生人数:"<<endl;
cin>>h;
for(z=0;z<h;z++)
{
cout<<"第"<<z+1<<"个学生的成绩:"<<endl;
cin>>r[z];
};
break;
}
case 2:
{
int ins_loc;
cout<<"要查找的学生成绩为:"<<endl;
cin>>ins_loc;
x=List.Get(ins_loc);
if(!error)
cout<<"该学生的序号为:1"<<List.Locate(ins_loc)<<endl;
break;
}
case 3:
{
int ins_loc,x;
cout<<"新的学生成绩插入在第几个位置之后:"<<endl;
cin>>ins_loc;
cout<<"新的学生成绩为:"<<endl;
cin>>x;
List.Insert(ins_loc,x);
break;
}
case 4:
{int ins_loc;
cout<<"需要删除第几个学生的成绩"<<endl;
cin>>ins_loc;
List.Delete(ins_loc);
cout<<"删除该学生的成绩后为:"<<endl;
break;
}
case 5:
{
flag=1;
break;
}
default:
{
cout<<"该命令没有找到!"<<endl;
break;
}
}
}
return 0;
}
实验结果如图片所示: