您的位置:首页 > 理论基础 > 数据结构算法

《数据结构》实验二: 线性表实验--------------第一题

2014-10-07 22:46 661 查看
《数据结构》实验二: 线性表实验

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

要求如下:

1)用顺序表来实现。

2)用单链表来实现。

1)顺序表

N-S图 (只是部分操作的N-S图):



//linklist.h
#ifndef LINK_LIST_H
#define LINK_LIST_H
#include <iostream>
using namespace std;
const int MaxSize=20;
template <class T>
class SeqList
{
public:
SeqList(){length=0;}
SeqList(T a[],int n);
int Length(){return length;}
T Get(int i);
int Locate(T x);
void Insert(T x,int i);
T Delete(int i);
void Print();
private:
T data[MaxSize];
int length;
};
#endif


//linklist.cpp

#include "linklist.h"
template <class T>
void SeqList<T>::Print()
{
for(int i=0;i<length;i++)
cout<<data[i]<<" ";
cout<<endl;
}
template <class T>
SeqList<T>::SeqList(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 SeqList<T>::Get(int i)
{
if(i<1||i>length) throw "位置";
else return data[i-1];
}
template <class T>
int SeqList<T>::Locate(T x)
{
for(int i=0;i<length;i++)
if(data[i]==x) return i+1;
return 0;
}
template <class T>
void SeqList<T>::Insert(T x,int i)
{
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 SeqList<T>::Delete(int i)
{
int x=data[i-1];
if(length==0) throw "下溢";
if(i<1||i>length) throw "位置";
for(int j=i;j<length;j++)
data[j-1]=data[j];
length--;
return x;
}

//main.cpp
#include "linklist.cpp"
void main()
{
int m,grade;
float a[10]={96,95,94,97,98,79,68,88,99,89};
SeqList<float> seqlist(a,10);
cout<<"学生成绩表如下:\n";
seqlist.Print();
cout<<"总共有"<<seqlist.Length()<<"个学生\n";
try
{
cout<<"你想获取第几个学生的成绩?\n请输入数字1到10:";
cin>>m;
cout<<seqlist.Get(m)<<endl;
}
catch(char*)
{
cout<<"获取有误!"<<endl;
}
cout<<"你想查询怎样的成绩在成绩表中的序号?(输出0表示该成绩不存在)\n请输入具体的成绩:";
cin>>m;
cout<<seqlist.Locate(m)<<endl;
try
{
cout<<"你想在成绩表中序号为几的位置上插入怎样的成绩?\n分别输入序号和成绩:";
cin>>m>>grade;
seqlist.Insert(grade,m);
cout<<"插入后的成绩表如下:\n";
seqlist.Print();
cout<<"此时成绩表中学生个数为:"<<seqlist.Length()<<endl;
}
catch(char*)
{
cout<<"插入有误!"<<endl;
}
try
{
cout<<"你想删除成绩表中第几个学生的成绩\n请输入序号(1到11):";
cin>>m;
seqlist.Delete(m);
cout<<"删除后的成绩表如下\n";
seqlist.Print();
cout<<"此时成绩表中学生个数为:"<<seqlist.Length()<<endl;
}
catch(char*)
{
cout<<"删除有误!"<<endl;
}
}


程序结果:





2)单链表

N-S图(只是部分操作的N-S图):







程序代码:
//1004.cpp

#include "LinkList.cpp"
void main()
{
int grade[]={92,95,91,93,94,98,97};
LinkList<int> linklist(grade,7);
cout<<"每个学生的成绩分别为:";
linklist.Print();
cout<<"学生个数:"<<linklist.length()<<"个"<<endl;
cout<<"成绩表中94分位于第"<<linklist.Locate(94)<<"个位置上"<<endl;
try
{
cout<<"成绩表中第三个分数为:";
cout<<linklist.Get(3)<<endl;
cout<<"在成绩表中的第三个位置插入成绩92"<<endl;
cout<<"插入前:";
linklist.Print();
cout<<"插入后:";
linklist.Insert(3,92);
linklist.Print();
cout<<"把第五个成绩删除"<<endl;
cout<<"删除前:";
linklist.Print();
cout<<"删除的成绩为:"<<linklist.Delete(5)<<endl;
cout<<"删除后:";
linklist.Print();
}
catch(double)
{
cout<<"获取的位置不存在!"<<endl;
exit(1);
}
catch(char*)
{
cout<<"删除的位置不存在!"<<endl;
exit(1);
}
catch(int)
{
cout<<"插入位置不存在!"<<endl;
exit(1);
}
}


//LinkList.cpp

#include "LinkList.h"
#include<stdlib.h>
template <class T>
LinkList<T>::LinkList()
{
first=new Node<T>;
first->next=NULL;
}
template <class T>
LinkList<T>::LinkList(T a[],int n)
{
first=new Node<T>;
Node<T>*r,*s;
r=first;
for(int i=0;i<n;i++)
{
s=new Node<T>;
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
template <class T>
LinkList<T>::~LinkList()
{
while(first!=NULL)
{
Node<T>*q;
q=first;
first=first->next;
delete q;
}
}
template <class T>
int LinkList<T>::length()
{
Node<T>*p;
p=first->next;
int count=0;
while(p!=NULL)
{
p=p->next;
count++;
}
return count;
}
template <class T>
T LinkList<T>::Get(int i)
{
Node<T>*p=first->next;
int count=1;
while(p!=NULL&&count<i)
{
p=p->next;
count++;
}
if(p==NULL) throw 1.2;
return p->data;
}
template <class T>
int LinkList<T>::Locate(T x)
{
Node<T>*p=first->next;
int count=1;
while(p!=NULL)
{
if(p->data==x)return count;
p=p->next;
count++;
}
return 0;
}
template <class T>
void LinkList<T>::Insert(int i,T x)
{
int count=0;
Node<T>*p=first;
while(p!=NULL&&count<i-1)
{
p=p->next;
count++;
}
if(p==NULL) throw 1;
else
{
Node<T>*s=new Node<T>;
s->data=x;
s->next=p->next;
p->next=s;
}
}

template<class T>
T LinkList<T>::Delete(int i)
{
T x;
Node<T>*p=first,*q;
int count=0;
while(p!=NULL&&count<i-1)
{
p=p->next;
count++;
}
if(p==NULL||p->next==NULL) throw "位置";
q=p->next;
x=q->data;
p->next=q->next;
delete q;
return x;
}
template <class T>
void LinkList<T>::Print()
{
Node<T>*p=first->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
//LinkList.h

#ifndef LINKLIST_H
#define LINKLIST_H
#include <iostream>
using namespace std;
template <class T>
class Node
{
public:
T data;
Node<T>*next;
};
template <class T>
class LinkList
{
public:
LinkList();
LinkList(T a[],int n);
~LinkList();
int length();
T Get(int i);
int Locate(T x);
void Insert(int i,T x);
T Delete(int i);
void Print();
private:
Node<T>*first;
};
#endif


程序结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: