线性表综合实验
一.实验目的
巩固线性表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相关知识来解决具体问题。
二.实验时间
准备时间为第7周到第8周,具体集中实验时间为第4周第2次课。2个学时.
三.实验内容
1.建立一个由n个学生成绩的顺序表,n的大小由自己确定,每一个学生的成绩信息由自己确定,实现数据的对表进行插入、删除、查找等操作。分别输出结果。
要求如下:
1)用顺序表来实现。
#ifndef SeqList_H
#define SeqList_H
const int Maxsize=10;
class SeqList
{
public:
SeqList(){length=0;}//无参构造函数,创建一个空表
SeqList(int id[],int n);//有参构造函数
~SeqList(){}//析构函数
void Insert(int i,int x);//在第i的位置插入分数x
int Delete(int i);//删除位置i对应的元素
int Get(int i);//按位查找,找位置i的元素;
int Locate (int x);//按值查找,查找表中值为x的元素的序号
void Print();//按序号依次输出各个元素
private:
int data[Maxsize];
int length;
};
#endif
#include<iostream>
using namespace std;
#include "SeqList.h"
SeqList::SeqList(int id[],int n)
{
if(n>Maxsize) throw"参数非法";
for(int i=0;i<n;i++)
data[i]=id[i];
length=n;
}
void SeqList::Insert(int i,int x)
{
if(length>Maxsize) throw"上溢";
if(i<1||i>length+1)throw"位置非法";
for(int j=length;j>=i;j--)
data[j]=data[j-1]; //第j个元素存放在数据下标为j-1处
data[i-1]=x;
length++;
}
int SeqList::Delete(int i)
{
if(length==0)throw"下溢";
if(i<1||i>length)throw"位置非法";
int x=data[i-1];
for(int j=i;j<length;j++)
data[j-1]=data[j]; //此处j已经是元素所在的数组下标
length--;
return x;
}
int SeqList::Locate(int x)
{
for(int i=0;i<length;i++)
if(data[i]==x)
return i+1; //下标为i的元素其序号为i+1
return 0; //查找失败,退出循环
}
void SeqList::Print()
{
for(int i=0;i<length;i++)
cout<<data[i] <<" ";
cout<<endl;
}
#include<iostream.h>
#include"SeqList.h"
void main()
{
int a[5]={91,92,93,94,95};
int x,y;
SeqList L(a,5);
cout<<"执行插入操作前的数据为:"<<endl;
L.Print();//输出所有元素
try
{
int i,m;
cout<<"请输入准备插入的数据的位置(1~5):"<<endl;
cin>>i;
cout<<"请输入准备插入的数据:"<<endl;
cin>>m;
L.Insert(i,m);
}
catch(char *r)
{
cout<<r<<endl;
}
cout<<"执行插入操作后的数据为:"<<endl;
L.Print();
cout<<"请输入需要查找的数据:"<<endl;
cin>>x;
cout<<L.Locate(x)<<endl;//
cout<<"请输入需要删除的数据的位置(1~5),删除前数据为:"<<endl;
cin>>y;
L.Print();
try
{
L.Delete(y);
}
catch(char *r)
{
cout<<r<<endl;
}
cout<<"删除后的数据为:"<<endl;
L.Print();
}
2)用单链表来实现。
#ifndef LinkList_H
#define LinkList_H
template <class L>
struct l
{
L data;
l<L> *next;
};
template <class L>
class LinkList
{
public:
LinkList();
LinkList(L a[],int n);
~LinkList();
int Locate(L x);
void Insert(int i,L x);
L Delete(int i);
void Print();
private:
l<L> *first;
};
#endif
#include <iostream>
using namespace std;
#include "LLL.h"
template <class L>
LinkList <L>::LinkList()
{
first=new l<L>;
first->next=NULL;
}
template <class L>
LinkList<L>::LinkList(L a[],int n)
{
l <L>*r,*s;
first=new l<L>;
r=first;
for(int i=0;i<n;i++)
{
s=new l<L>;
s->data=a[i];
r->next=s;r=s;
}
r->next=NULL;
}
template <class L>
LinkList<L>::~LinkList()
{
l<L> *q=NULL;
while(first!=NULL)
{
q=first;
first=first->next;
delete q;
}
}
template <class L>
void LinkList<L>::Insert(int i,L x)
{
l<L>*p=first,*s=NULL;
int count=0;
while(p!=NULL && count<i-1)
{
p=p->next;
count++;
}
if(p==NULL) throw"位置";
else
{
s=new l<L>;s->data=x;
s->next=p->next;p->next=s;
}
}
template <class L>
L LinkList<L>::Delete(int i)
{
l<L> *p=first,*q=NULL;
L x;
int count=0;
while(p!=NULL && count<i-1)
{
p=p->next;
count++;
}
if(p==NULL || p->next==NULL)
throw"位置";
else
{
q=p->next;x=q->data;
p->next=q->next;
delete q;
return x;
}
}
template <class L>
int LinkList<L>::Locate(L x)
{
l<L> *p=first->next;
int count=1;
while(p!=NULL)
{
if (p->data==x) return count;
p=p->next;
count++;
}
return 0;
}
template <class L>
void LinkList<L>::Print()
{
l<L> *p=first->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
#include<iostream>
using namespace std;
#include"LLL.cpp"
void main()
{
int a[5]={91,92,93,94,95};
int x,y;
LinkList <int> Z(a,5);
cout<<"执行插入操作前的数据为:"<<endl;
Z.Print();//输出所有元素
try
{
int i,m;
cout<<"请输入准备插入的数据的位置(1~5):"<<endl;
cin>>i;
cout<<"请输入准备插入的数据:"<<endl;
cin>>m;
Z.Insert(i,m);
}
catch(char *r)
{
cout<<r<<endl;
}
cout<<"执行插入操作后的数据为:"<<endl;
Z.Print();
cout<<"请输入需要查找的数据:"<<endl;
cin>>x;
cout<<"您查找的数据所在位置为:"<<endl;
cout<<Z.Locate(x)<<endl;
cout<<"请输入需要删除的数据的位置(1~5),删除前数据为:"<<endl;
cin>>y;
Z.Print();
try
{
Z.Delete(y);
}
catch(char *r)
{
cout<<r<<endl;
}
cout<<"删除后的数据为:"<<endl;
Z.Print();
}
![](https://i-blog.csdnimg.cn/blog_migrate/24ef0e37ea4fcf9e65365f774cb43589.png)
3)用双链表实现。
#ifndef LinkList_H
#define LinkList_H
template <class L>
struct l
{
L data;
l<L> *prior,*next;
};
template <class L>
class LinkList
{
public:
LinkList();
LinkList(L a[],int n);
~LinkList();
int Locate(L x);
void Insert(int i,L x);
L Delete(int i);
void Print();
private:
l<L> *first;
};
#endif
#include <iostream>
using namespace std;
#include "LLL.h"
template <class L>
LinkList <L>::LinkList()
{
first=new l<L>;
first->next=NULL;
first->prior=NULL;
}
template <class L>
LinkList<L>::LinkList(L a[],int n)
{
l <L>*r,*s;
first=new l<L>;
r=first;
for(int i=0;i<n;i++)
{
s=new l<L>;
s->data=a[i];
r->next=s;r=s;
}
r->next=NULL;
}
template <class L>
LinkList<L>::~LinkList()
{
l<L> *q=NULL;
while(first!=NULL)//释放单链表的每一个结点的存储空间
{
q=first; //暂存被释放结点
first->prior->next=first->next;
first->next->prior=first->prior;
first=first->next;//first指向被释放结点的下一结点
delete q;
}
delete first;
}
template <class L>
void LinkList<L>::Insert(int i,L x)
{
l<L>*p=first,*s=NULL;
int count=0;
while(p!=NULL && count<i-1)
{
p=p->next;
count++;
}
if(p==NULL) throw"位置";
else
{
s=new l<L>;s->data=x;
s->next=p->next;p->next=s;
}
}
template <class L>
L LinkList<L>::Delete(int i)
{
l<L> *p=first,*q=NULL;
int count=0;
while(p!=NULL && count<i-1)
{
p=p->next;
count++;
}
if(p==NULL || p->next==NULL)
throw"位置";
else
{
L x=p->data;
(p->prior)->next=p->next;
(p->next)->prior=p->prior;
delete q;
return x;
}
}
template <class L>
int LinkList<L>::Locate(L x)
{
l<L> *p=first->next;
int count=1;
while(p!=NULL)
{
if (p->data==x) return count;
p=p->next;
count++;
}
return 0;
}
template <class L>
void LinkList<L>::Print()
{
l<L> *p=first->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
#include<iostream>
using namespace std;
#include"LLL.cpp"
void main()
{
int a[5]={91,92,93,94,95};
int x,y;
LinkList <int> Z(a,5);
cout<<"执行插入操作前的数据为:"<<endl;
Z.Print();//输出所有元素
try
{
int i,m;
cout<<"请输入准备插入的数据的位置(1~5):"<<endl;
cin>>i;
cout<<"请输入准备插入的数据:"<<endl;
cin>>m;
Z.Insert(i,m);
}
catch(char *r)
{
cout<<r<<endl;
}
cout<<"执行插入操作后的数据为:"<<endl;
Z.Print();
cout<<"请输入需要查找的数据:"<<endl;
cin>>x;
cout<<"您查找的数据所在位置为:"<<endl;
cout<<Z.Locate(x)<<endl;//查找元素95,并返回其所在位置
cout<<"请输入需要删除的数据的位置(1~5),"<<endl;
cin>>y;
Z.Print();
try
{
Z.Delete(y);
}
catch(char *r)
{
cout<<r<<endl;
}
cout<<"删除后的数据为:"<<endl;
Z.Print();
}
运行结果:
4)用静态链表实现。
#include<iostream>
using namespace std;
const int MaxSize=100;
template<class DataType>
struct SNode
{
DataType data; //不确定的数据类型
int next; //指针域
};
template<class DataType>
class SLinkList
{
public:
SLinkList();
SLinkList(DataType a[],int n);
~SLinkList(){};
void Insert(int i,int x);
int Locate(DataType x);
DataType Delete(int i);
void Print();
private:
SNode<DataType>data[MaxSize];
int frist,avail;
};
template<class DataType>
SLinkList<DataType>::SLinkList()
{
frist=0;
avail=0;
data[0].next=-1;
for(int i;i<MaxSize-1;i++)
{
data[i].next=i+1;
}
data[MaxSize-1].next=-1;
}
template<class DataType>
SLinkList<DataType>::SLinkList(DataType a[],int n)
{
int s;
if(n>=MaxSize||n<=0)throw"位置";
frist=0;
data[0].next=avail=1;
for(int i=0;i<MaxSize-1;i++)
{
data[i].next=i+1;
}
data[MaxSize-1].next=-1;
for(int j=0;j<n;j++)
{
s=avail;
data[s].data=a[j];
avail=data[avail].next;
}
data[s].next=-1;
}
template<class DataType>
void SLinkList<DataType>::Insert(int i,int x)
{
int s;
s=avail;
avail=data[avail].next;
data[s].data=x;
for(int p=0;p<MaxSize-1;p++)
{
if(p==i)
{
data[s].next=data[p].next;
data[p].next=s;
}
}
}
template<class DataType>
DataType SLinkList<DataType>::Delete(int i)
{
if(i>0 &&i<MaxSize)
{
int q;
i=i-1;
q=data[i].next;
data[i].next=data[q].next;
data[q].next=avail;
avail=q;
return data[q].data;
}
else
{
throw"位置";
}
}
template<class DataType>
int SLinkList<DataType>::Locate(DataType x)
{
int count;
count=data[frist].next;
for(count;count!=-1;count++)
{if(data[count].data==x)
{
return count;
}
}
return 0;
}
template<class DataType>
void SLinkList<DataType>::Print()
{
int p;
p=data[frist].next;
while(p!=-1)
{
cout<<data[p].data<<" ";
p=data[p].next;
}
cout<<endl;
}
void main()
{
int a[5]={91,92,93,94,95};
int x,y;
SLinkList <int> Z(a,5);
cout<<"执行插入操作前的数据为:"<<endl;
Z.Print();//输出所有元素
try
{
int i,m;
cout<<"请输入准备插入的数据的位置(1~5):"<<endl;
cin>>i;
cout<<"请输入准备插入的数据:"<<endl;
cin>>m;
Z.Insert(i,m);
}
catch(char *r)
{
cout<<r<<endl;
}
cout<<"执行插入操作后的数据为:"<<endl;
Z.Print();
cout<<"请输入需要查找的数据:"<<endl;
cin>>x;
cout<<"您查找的数据所在位置为:"<<endl;
cout<<Z.Locate(x)<<endl;//查找元素95,并返回其所在位置
cout<<"执行删除操作前的数据为是:"<<endl;
Z.Print();
cout<<"请输入需要删除的数据的位置(1~5),"<<endl;
cin>>y;
try
{
Z.Delete(y);
}
catch(char *r)
{
cout<<r<<endl;
}
cout<<"删除后的数据为:"<<endl;
Z.Print();
}
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/707654174f3515cc32e675f220b2de5f.png)
5)用间接寻址实现。
#include<iostream>
#include<string>
using namespace std;
const int MaxSize=100;
template<class DataType>
struct Node
{
DataType data;
};
template<class DataType>
class IALink
{
public:
IALink(DataType a[],int n);
~IALink(){}
void Insert(int i,int x);
int Locate(DataType x);
DataType Delete(int i);
void Print();
private:
Node<DataType>*address[MaxSize];
int length;
};
template<class DataType>
IALink<DataType>::IALink(DataType a[],int n)
{
for(int i=0;i<n;i++)
{
address[i]=new Node<DataType>;
address[i]->data=a[i];
}
length=n;
}
template<class DataType>
void IALink<DataType>::Insert(int i,int x)
{
if(i<=length && i>0)
{
for(int j=length;j>=i;j--)
{
address[j]=address[j-1];
}
address[i-1]->data=x;
length++;
}
else throw"位置";
}
template<class DataType>
DataType IALink<DataType>::Delete(int i)
{
if(i<=length && i>=0)
{
int x=address[i-1]->data;
for(int j=i;j<length;j++)
{
address[j-1]=address[j];
}
length--;
return x;
}
else throw"位置";
}
template<class DataType>
int IALink<DataType>::Locate(DataType x)
{
for(int i=0;i<length;i++)
{
if(address[i]->data==x)
return i+1;
}
return 0;
}
template<class DataType>
void IALink<DataType>::Print()
{
for(int i=0;i<length;i++)
cout<<address[i]->data<<" ";
cout<<endl;
}
void main()
{
int a[5]={91,92,93,94,95};
int x,y;
IALink <int> Z(a,5);
cout<<"执行插入操作前的数据为:"<<endl;
Z.Print();//输出所有元素
try
{
int i,m;
cout<<"请输入准备插入的数据的位置(1~5):"<<endl;
cin>>i;
cout<<"请输入准备插入的数据:"<<endl;
cin>>m;
Z.Insert(i,m);
}
catch(char *r)
{
cout<<r<<endl;
}
cout<<"执行插入操作后的数据为:"<<endl;
Z.Print();
cout<<"请输入需要查找的数据:"<<endl;
cin>>x;
cout<<"您查找的数据所在位置为:"<<endl;
cout<<Z.Locate(x)<<endl;//查找元素95,并返回其所在位置
cout<<"执行删除操作前的数据为是:"<<endl;
Z.Print();
cout<<"请输入需要删除的数据的位置(1~5),"<<endl;
cin>>y;
try
{
Z.Delete(y);
}
catch(char *r)
{
cout<<r<<endl;
}
cout<<"删除后的数据为:"<<endl;
Z.Print();
}
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/229c3961e2d6e576a5af24b70e68543a.png)
分开写程序,可以一个方法分别写一博客文章上交作业。
2.实现两个集合的相等判定、并、交和差运算。要求:
1)自定义数据结构
2)自先存储结构,并设计算法。在VC中实现。
以上三题,第1题必须完成。第2题可以作为选做题。
四.实验报告
1.在博客中先写上实习目的和内容,画出主要操作运算算法图,然后分别上传程序代码。插入调试关键结果截图。
2.单独写一个博文,比较总结线性表的几种主要存储结果。