一.实验目的:
巩固线性表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相 关知识来解决具体问题。
二、实验内容:
1.建立一个由 n 个学生成绩的顺序表,n 的大小由自己确定,每一个学生的成绩信息由自己 确定,实现数据的对表进行插入、删除、查找等操作。分别输出结果。 要求如下: 1)用顺序表来实现。 2)用单链表来实现。 3)用双链表实现。 4)用静态链表实现。 5)用间接寻址实现。
1、用顺序表实现
#include<iostream>
using namespace std;
const int MaxSize=100;
class Seqlist
{
double score[MaxSize];
int length;
public:
Seqlist(){length=0;} //无参的构造函数,建立一个空的顺序表
Seqlist(double a[],int n) //有参的构造函数,建立一个长度为n的顺序表
{
if(n>MaxSize) throw"超过最大学生人数!";
for(int i=0;i<n;i++)
score[i]=a[i];
length=n;
}
~Seqlist(){} //析构函数
int Getlength(){return length;} //求线性表的长度
double Getnum(int i) //按位查找学生的成绩
{
if(i<1&&i>length) throw"不存在该学生!";
return score[i-1];
}
double Locate(double x) //按值查找学生的位置
{
if(x<0&&x>100) throw"分数非法!";
for(int i=0;i<length;i++)
if(score[i-1]==x)
return i;
return 0;
}
void Insert(int i,double x) //插入操作,在线性表的第i个位置插入值为x的学生会学生成绩
{
if(length>=MaxSize) throw"上溢";
if(i<1||i>length+1) throw"位置异常";
for(int j=length;j>=i;j--)
score[j]=score[j-1];
score[i-1]=x;
length++;
}
int Delete(int i) //删除操作,删除顺序表中的第i个位置的学生成绩
{
if(length==0) throw"下溢";
if(i<1||i>length) throw"位置异常";
double x;
x=score[i-1];
for(int j=i;j<length;j++)
score[j-1]=score[j];
length--;
return x;
}
void Print()
{
for(int i=0;i<length;i++)
cout<<"第"<<i+1<<"个学生的成绩为: "<<score[i]<<endl;
}
};
void main()
{
cout<<"***顺序表的代码与实现***"<<endl;
double a[5]={80,76,91.5,75,68.5};
Seqlist A(a,5);
cout<<"执行插入操作前的数据: "<<endl;
A.Print();
cout<<"执行插入操作,在第二个位置插入学生成绩85"<<endl;
A.Insert(2,85);
cout<<"执行插入操作后的数据: "<<endl;
A.Print();
cout<<"查询到第四个的位置上学生的成绩为: "<<A.Getnum(4)<<endl;
cout<<"查询学生成绩为75的位置为: "<<A.Locate(75)<<endl;
cout<<"执行删除操作,删除第二个的位置上学生的成绩"<<endl;
A.Delete(2);
cout<<"执行删除操作后的数据: "<<endl;
A.Print();
}
2、用单链表实现
#include<iostream>
using namespace std;
const int MaxSize=100;
template<class D> //定义模板类D
struct Node //定义结构体,用于结点的申请
{
D date;
Node<D> *next;
};
template<class D>
class Linklist
{
Node<D> *first; //单链表的头指针
public:
Linklist() //无参的构造函数,建立一个空的顺序表
{
first=new Node; //生成头结点
first->next=NULL; //头结点的指针域置为空
}
Linklist(D a[],int n) //有参的构造函数,建立一个长度为n的顺序表
{
Node<D> *r,*s;
first=new Node<D>; //生成头结点
r=first; //尾指针初始化
for(int i=0;i<n;i++)
{
s=new Node<D>;s->date=a[i]; //为每一个数组元素建立一个结点
r->next=s;r=s; //将结点s插入到头结点之后
}
r->next=NULL; //将终端结点的指针置为空
}
~Linklist() //析构函数
{
Node<D> *q=NULL;
while(first!=NULL) //释放单链表的每一个结点的存储空间
{
q=first; //暂存被释放结点
first=first->next; //first指向被释放结点的下一个结点