《数据结构》实验二: 线性表实验
一..实验目的
巩固线性表的数据结构,学会线性表的应用。
1.回顾线性表的逻辑结构,线性表的物理存储结构和常见操作。
2.学习运用线性表的知识来解决实际问题。
3.进一步巩固程序调试方法。
4.进一步巩固模板程序设计。
二.实验时间
准备时间为第2周到第4周,具体集中实验时间为第4周第2次课。2个学时。
三..实验内容
1.建立一个N个学生成绩的顺序表,对表进行插入、删除、查找等操作。分别输出结果。
要求如下:
1)用顺序表来实现。
头文件:
const int MaxSize = 70;
template <class DataType>
class Grade
{
public:
Grade() { length = 0; }
Grade(DataType a[],int n);
~Grade() {}
int Length() { return length;} //求线性表的长度;
void Insert( int i,DataType x); //插入操作,在线性表中第i个位置插入值x为的元素
DataType Delete(int i); //删除操作,删除线性表的第i个元素
DataType Get(int i); //按位查找
int Locate( DataType x); //按值查找
void PrintGrade(); //遍历操作,按序号依次输出元素
private:
DataType data[MaxSize];
int length;
};
源文件:
#include<iostream>
#include "Orderlist.h"
using namespace std;
template< class DataType >
Grade< DataType >::Grade( DataType a[], int n) //有参构造函数Grade
{
if( n>MaxSize ) throw "非法参数";
for(int i=0;i<n;i++ )
{
data[i] = a[i];
length = n;
}
}
template<class DataType>
void Grade<DataType>::Insert( int i,DataType x) //插入算法Insert
{
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 DataType>
DataType Grade <DataType>::Delete(int i) //删除算法Delete
{
if(length==0) throw "下溢";
if(i<1 || i>length) throw "位置";
else {
int x;
x = data[i-1];
for( int j=i;j<length;j++)
data[j-1]=data[j];
length--;
cout<<"删除第"<<i<<"个元素,其值为"<<x<<endl;
}
return 0;
}
template<class DataType> //遍历数组
void Grade<DataType>::PrintGrade()
{
for(int i=0;i<length;i++)
cout<<data[i]<<" ";
}
template<class DataType> //按位查找
DataType Grade<DataType>::Get(int i)
{
if(i<1 || i>length) throw "查找非法位置";
else cout<<data[i-1]<<endl;
return 0;
}
int main()
{
int a[]={100,99,98,97,96,95,94,93,92,91,90,89};
Grade<int> gra1(a,12);
cout<<"原数组为:"<<endl; //遍历数组
gra1.PrintGrade();
cout<<"\n"<<endl;
cout<<"在第5个位置插入10"<<endl; //插入操作
gra1.Insert(5,10);
gra1.PrintGrade();
cout<<"\n"<<endl;
gra1.Delete(8); //删除操作
gra1.PrintGrade();
cout<<"\n"<<endl;
cout<<"第3个位置的值为:"<<endl; //查找位置
gra1.Get(3);
cout<<"\n"<<endl;
return 0;
}
2 )单链表
头文件:
int n=0;
struct student
{
long num;
float score;
student * next;
};
源文件:
#include<iostream>
#include "Linklist.h"
using namespace std;
student *creat() //建立链表
{
student * head,* p1,* p2;
head=NULL;
p1=new student;
p2=p1;
cout<<"请输入学号和成绩分数,当学号输入为0时,停止输入"<<endl;
cin>>p1->num>>p1->score;
while(p1->num!=0)
{
n++;
if(n==1)
head=p1;
else
{
p2->next=p1;
p2=p1;
}
p1=new student;
cin>>p1->num>>p1->score;
}
delete p1;
p2->next=NULL;
return head;
}
void pri(student * head) //输出链表
{
student *p;
p=head;
if (p==NULL) return;
do
{
cout<<p->num<<" "<<p->score<<endl;
p=p->next;
}while(p!=NULL);
}
student *del(student *head,int num) //删除列表
{
student *p1,*p2;
if(head==NULL)
{
cout<<"list null"<<endl;
return head;
}
p1=head;
while(num!=p1->num && p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(num==p1->num)
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
cout<<"delete:"<<num<<endl;
n--;
}
else
cout<<num<<"not been found!"<<endl;
return head;
}
student *insert(student * head, student * stud) //插入数据
{
student *p0,*p1,*p2;
p1=head;
p0=stud;
if(head==NULL)
{
head=p0;
p0->next=NULL;
}
else
while((p0->num>p1->num) && p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(p0->num<=p1->num)
{
if(head==p1)
head=p0;
else
p2->next=p0;
p0->next=p1;
}
else
{
p0=p1->next;
p0->next=NULL;
}
n++;
return head;
}
int main()
{
student * head=creat();
cout<<"\n新建的链表为:"<<endl;
pri(head);
int num;
cout<<"\n请输入要删除的学号"<<endl;
cin>>num;
head=del(head,num);
cout<<"\n目前的链表是:"<<endl;
pri(head);
student *pt=new student;
cout<<"\n请输入要插入学生的学号和成绩:"<<endl;
cin>>pt->num>>pt->score;
head=insert(head,pt);
cout<<"\n目前的链表是:"<<endl;
pri(head);
return 0;
}