实验二 数据结构——线性表的实验

来源:互联网 发布:无证之罪 郭宇 知乎 编辑:程序博客网 时间:2024/04/29 19:20

《数据结构》实验二:     线性表实验

一..实验目的

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

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;
}


0 0
原创粉丝点击