实验二线性表实验

  线性表实验

一..实验目的

     巩固线性表的数据结构,学会线性表的应用。

1.回顾线性表的逻辑结构,线性表的物理存储结构和常见操作。

2.学习运用线性表的知识来解决实际问题。

3.进一步巩固程序调试方法。

4.进一步巩固模板程序设计。

二.实验时间

   准备时间为第2周到第4周,具体集中实验时间为第4周第2次课。2个学时。

三..实验内容

1.建立一个N个学生成绩的顺序表,对表进行插入、删除、查找等操作。分别输出结果。

要求如下:

1)用顺序表来实现a.创建头文件“STUDENT.h”通过创建多文件

#ifndef STUDENT_H
#define STUDENT_H
#include <iostream>
using namespace std;
const int maxsize=50;
template <class T>
class Sgrade
{public:
Sgrade(){length=0;}
Sgrade(T a[],int n);
~Sgrade(){}
int Length(){return length;}
T get(int i);
int locate(T x);
void instert(int i,T x);
T Delete(int i);
void printlist();
private:
    T data[maxsize];
int length;
};
#endif
b.创建源程序文件“STUDENT1.cpp”
#include <iostream>
using namespace std;
#include "STUDENT.h"
template <class T>
Sgrade<T>::Sgrade(T a[],int n)
{
if(n>maxsize)throw"非法参数";
for(int i=0;i<n;i++)                 
        data[i]=a[i];
length=n;
}

template <class T>
T Sgrade<T>::get(int i)
{
  if(i<1&&i>length)throw"位置";
  else return data[i-1];
} 

template <class T>
int Sgrade<T>::locate(T x)
{
for(int i=0;i<length;i++)
   if(data[i]==x)return i+1;
return 0;
}

template <class T>
void Sgrade<T>::instert(int i,T x)
{
if(length>=maxsize)throw"上溢";
if(i<1 || i>=length+1)throw"位置";
for(int j=length;j>=i;j--)
  data[j]=data[j-1];
       data[i-1]=x;
 length++;
}

template <class T>
T Sgrade<T>::Delete(int i)
{
if(length==0)throw"下溢";
if(i<1||i>length)throw"位置";
T x=data[i-1];
    for(int j=i;j<length;j++)
data[j-1]=data[j];
length--;
return x;
}

template <class T>
void Sgrade<T>::printlist()
{
for(int i=0;i<length;i++)
cout<<data[i]<<" ";
cout<<endl;
}
void main()                              //主函数
{
int r[5]={11,12,13,14,15};
 Sgrade<int> R(r,5);
cout<<"执行插入操作前的数据为:"<<endl;
R.printlist();
R.instert(2,16);
cout<<"执行插入操作后的数据为:"<<endl;
R.printlist();
cout<<"查找值为12的元素位置:"<<endl;
cout<<R.locate(12)<<endl;
cout<<"执行删除操作前的数据为:"<<endl;
R.printlist();
R.Delete(3);
cout<<"执行删除操作后的数据为:"<<endl;
R.printlist();
}

实验结果:


2)用 单链表 来实现:创建多文件

a.创建头文件“Student.h”

#ifndef Student_H
#define Student_H
template<class T1>
struct node                             //结构体
{
T1 data;
node<T1>*next;
};
template <class T1>
class Sgrade
{
public:
        Sgrade();
Sgrade(T1 a[],int n);
~Sgrade();
int length();
T1 get(int i);
int locate(T1 x);
void insert(int i,T1 x);
T1 Delete(int i);
void printlist();
private:
node<T1>*first;
};
#endif

b.创建源程序文件“Student.cpp”

#include <iostream>
using namespace std;
#include"Student.h"
template <class T1>
Sgrade<T1>::Sgrade()
{
first=new node<T1>;
first->next=NULL;
}
template <class T1>
Sgrade<T1>::Sgrade(T1 a[],int n)
{
node<T1>*r,*s;
first=new node<T1>;
r=first;
for(int i=0;i<n;i++)
{
s=new node<T1>;
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
template <class T1>
Sgrade<T1>::~Sgrade()
{
node<T1>*q;
while(first!=NULL)
{
q=first;
first=first->next;
delete q;
}
}
template <class T1>
void Sgrade<T1>::insert(int i,T1 x)
{
node<T1>*p=first,*s;
int count=0;
while (p!=NULL && count<i-1)
{
p=p->next;
count++;
}
if(p==NULL)throw"位置";
else
{
s=new node<T1>;
s->data=x;
s->next=p->next;
p->next=s;
}
}
template <class T1>
T1 Sgrade<T1>::Delete(int i)
{
node<T1>*p,*q;
T1 x;
int count=0;
p=first;
while(p!=NULL && count<i-1)
{
p=p->next;
count++;
}
if(p==NULL || p->next==NULL)throw"位置";
else
{
q=p->next;
x=q->data;
delete q;
return x;
}
}
template <class T1>
int Sgrade<T1>::locate(T1 x)
{
node<T1>*p=first->next;
int count=1;
while(p!=NULL)
{
if(p->data==x)return count;
p=p->next;
count++;
}
return 0;
}
template <class T1>
 void Sgrade<T1>::printlist()
{
node<T1>*p=first->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}

c.创建头文件“Student1.cpp”

#include <iostream>
using namespace std;
#include"Student.cpp"
void main()
{
int r[5]={11,12,13,14,15};
Sgrade<int>R(r,5);
    cout<<"执行插入操作前的数据为:"<<endl;
R.printlist();
R.insert(2,16);
cout<<"执行插入操作后的数据为:"<<endl;
R.printlist();
cout<<"查找值为12的元素位置:"<<endl;
cout<<R.locate(12)<<endl;
cout<<"执行删除操作前的数据为:"<<endl;
R.printlist();
R.Delete(3);
cout<<"执行删除操作后的数据为:"<<endl;
R.printlist();
}

实验结果




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值