数据结构实验三

《数据结构》实验三:                 线性表综合实验 

一.实验目的:

巩固线性表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相 关知识来解决具体问题。

二、实验内容:

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指向被释放结点的下一个结点

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值