《数据结构》实验二:
线性表实验
一..实验目的
巩固线性表的数据结构,学会线性表的应用。
1.回顾线性表的逻辑结构,线性表的物理存储结构和常见操作。
2.学习运用线性表的知识来解决实际问题。
3.进一步巩固程序调试方法。
4.进一步巩固模板程序设计。
二.实验时间
准备时间为第2周到第4周,具体集中实验时间为第4周第2次课。2个学时。
三..实验内容
1.建立一个N个学生成绩的顺序表,对表进行插入、删除、查找等操作。分别输出结果。
要求如下:
1)用顺序表来实现。
2)用单链表来实现。
2.解决约瑟夫问题
设有编号为1,2,3,n的n(n>0)个人围在一起,每人持有一个密码m,从第一个人开始报数,报到m时停止报数,报m的人出圈,再从下一个人开始重新报数,报到m时停止报数,报m的人出圈,……直到的所有人出圈为止。当给定n和m后,输出出圈的次序。
要求如下:自定义数据结构,确定存储方法,并设计算法。在主程序中输入n和m后,输出结果。
3.实现两个集合的相等判定、并、交和差运算。要求:
1)自定义数据结构
2)自先存储结构,并设计算法。在VC中实现。
以上三题,第1题必须完成。第2和第3题可以作为选做题。
首先是头文件:
- #define Seqlist_H
- const int MaxSize=60;
- class Seqlist
- {
- public:
- Seqlist(){length=0;}
- Seqlist(int a[],int n);
- ~Seqlist(){}
- void Insert(int i,int x);
- int Delete(int i);
- int Locate(int x);
- int Get(int x);
- void PrintList();
- private:
- int data[MaxSize];
- int length;
- };
#define Seqlist_H
const int MaxSize=60;
class Seqlist
{
public:
Seqlist(){length=0;}
Seqlist(int a[],int n);
~Seqlist(){}
void Insert(int i,int x);
int Delete(int i);
int Locate(int x);
int Get(int x);
void PrintList();
private:
int data[MaxSize];
int length;
};
显然说书本上有,,不过哥已经弄通了。。
接着是程序代码-->>
- #include<iostream>
- #include<iomanip>
- using namespace std;
- #include "Seqlist.H"
- Seqlist::Seqlist(int a[],int n)
- {
- if(n>MaxSize)throw"参数非法";
- for(int i=0;i<n;i++)
- data[i]=a[i];
- length=n;
- }
- void Seqlist::Insert(int i,int 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++;
- }
- int Seqlist::Delete(int i)
- {
- if(length==0)throw"下溢";
- if(i<1||i>length)throw"位置非法";
- int x=data[i-1];
- for (int j=i;j<length;j++)
- data[j-1]=data[j];
- length--;
- return x;
- }
- int Seqlist ::Locate(int x)
- {
- for(int i=0;i<length;i++)
- if(data[i]==x)return i+1;
- return 0;
- }
- int Seqlist::Get(int x)
- {
- if(x<1&&x>length)throw"位置非法";
- else return data[x-1];
- }
- void Seqlist ::PrintList()
- {
- for(int i=0;i<length;i++)
- cout<<setw(5)<<data[i]<<"";
- cout<<endl;
- }
#include<iostream>
#include<iomanip>
using namespace std;
#include "Seqlist.H"
Seqlist::Seqlist(int a[],int n)
{
if(n>MaxSize)throw"参数非法";
for(int i=0;i<n;i++)
data[i]=a[i];
length=n;
}
void Seqlist::Insert(int i,int 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++;
}
int Seqlist::Delete(int i)
{
if(length==0)throw"下溢";
if(i<1||i>length)throw"位置非法";
int x=data[i-1];
for (int j=i;j<length;j++)
data[j-1]=data[j];
length--;
return x;
}
int Seqlist ::Locate(int x)
{
for(int i=0;i<length;i++)
if(data[i]==x)return i+1;
return 0;
}
int Seqlist::Get(int x)
{
if(x<1&&x>length)throw"位置非法";
else return data[x-1];
}
void Seqlist ::PrintList()
{
for(int i=0;i<length;i++)
cout<<setw(5)<<data[i]<<"";
cout<<endl;
}
主函数-->>
- #include<iostream>
- using namespace std;
- #include "Seqlist.H"
- void main()
- {
- int r[5]={12,23,38,49,57};
- Seqlist L(r,5);
- cout<<"执行插入学生成绩前数据为:"<<endl;
- L.PrintList();
- try
- {
- L.Insert(2,89);
- }
- catch (char *s)
- {
- cout<<s<<endl;
- }
- cout<<"执行插入后学生成绩的数据为:"<<endl;
- L.PrintList();
- try
- {
- L.Delete(1);
- }
- catch (char *s)
- {
- cout<<s<<endl;
- }
- cout<<"成绩为38的元素位置为:";
- cout<<L.Locate(38)<<endl;
- cout<<"位置为4的成绩位置为:";
- cout<<L.Get(4)<<endl;
- cout<<"删除后成绩为:"<<endl;
- L.PrintList();
- system("pause");
- }
#include<iostream>
using namespace std;
#include "Seqlist.H"
void main()
{
int r[5]={12,23,38,49,57};
Seqlist L(r,5);
cout<<"执行插入学生成绩前数据为:"<<endl;
L.PrintList();
try
{
L.Insert(2,89);
}
catch (char *s)
{
cout<<s<<endl;
}
cout<<"执行插入后学生成绩的数据为:"<<endl;
L.PrintList();
try
{
L.Delete(1);
}
catch (char *s)
{
cout<<s<<endl;
}
cout<<"成绩为38的元素位置为:";
cout<<L.Locate(38)<<endl;
cout<<"位置为4的成绩位置为:";
cout<<L.Get(4)<<endl;
cout<<"删除后成绩为:"<<endl;
L.PrintList();
system("pause");
}
执行结果=_=
以上是用顺序表,接下来使用单链表-->>
头文件-->>
- #ifndef LinkList_H
- #define LinkList_H
- template<class DataType>
- struct Node
- {
- DataType data;
- Node<DataType>*next;
- };
- template<class DataType>
- class LinkList
- {
- public:
- LinkList();
- LinkList(DataType a[],int n);
- ~LinkList();
- int Locate(DataType x);
- int Get(DataType x);
- void Insert (int i,DataType x);
- DataType Delete(int i);
- void PrintList();
- private:
- Node<DataType>*first;
- };
- #end
#ifndef LinkList_H
#define LinkList_H
template<class DataType>
struct Node
{
DataType data;
Node<DataType>*next;
};
template<class DataType>
class LinkList
{
public:
LinkList();
LinkList(DataType a[],int n);
~LinkList();
int Locate(DataType x);
int Get(DataType x);
void Insert (int i,DataType x);
DataType Delete(int i);
void PrintList();
private:
Node<DataType>*first;
};
#end
程序文件-->>
- #include<iostream>
- #include<iomanip>
- #include"LinkList.H"
- using namespace std;
- template<class DataType>
- LinkList<DataType>::LinkList()
- {
- first=new Node<DataType>;
- first->next=NULL;
- }
- template<class DataType>
- LinkList<DataType>::LinkList(DataType a[],int n)
- {
- Node <DataType>*r,*s;
- first=new Node<DataType>;
- r=first;
- for (int i=0;i<n;i++)
- {
- s=new Node<DataType>;
- s->data=a[i];
- r->next=s;r=s;
- }
- r->next=NULL;
- }
- template<class DataType>
- LinkList<DataType>::~LinkList()
- {
- Node<DataType>*q=NULL;
- while(first!=NULL)
- {
- q=first;
- first=first->next;
- delete q;
- }
- }
- template<class DataType>
- void LinkList<DataType>::Insert(int i,DataType x)
- {
- Node<DataType>*p=first,*s=NULL;
- int count=0;
- while(p!=NULL&&count<i-1)
- {
- p=p->next;
- count++;
- }
- if(p==NULL)throw"位置";
- else
- {
- s=new Node<DataType>;
- s->data=x;
- s->next=p->next;
- p->next=s;
- }
- }
- template<class DataType>
- DataType LinkList<DataType>::Delete(int i)
- {
- Node<DataType>*p=first,*q=NULL;
- DataType x;
- int count=0;
- while(p!=NULL&&count<i-1)
- {
- p=p->next;
- count++;
- }
- if(p==NULL||p->next==NULL)
- throw"位置";
- else
- {
- q=p->next;
- x=q->data;
- p->next=q->next;
- delete q;
- return x;
- }
- }
- template<class DataType>
- int LinkList<DataType>::Locate(DataType x)
- {
- Node<DataType>*p=first->next;
- int count=1;
- while(p!=NULL)
- {
- if(p->data==x)return count;
- p=p->next;
- count++;
- }
- return 0;
- }
- template<class DataType>
- int LinkList<DataType>::Get(DataType x)
- {
- Node<DataType>*p=first->next;
- p=first->next; int count=1;
- while(p!=NULL&&count<1)
- {
- p=p->next;
- count++;
- }
- if(p==NULL)throw"位置";
- else return p->data;
- }
- template<class DataType>
- void LinkList<DataType>::PrintList()
- {
- Node<DataType>*p=first->next;
- while(p!=NULL)
- {
- cout<<setw(5)<<p->data<<" ";
- p=p->next;
- }
- cout<<endl;
- }
#include<iostream>
#include<iomanip>
#include"LinkList.H"
using namespace std;
template<class DataType>
LinkList<DataType>::LinkList()
{
first=new Node<DataType>;
first->next=NULL;
}
template<class DataType>
LinkList<DataType>::LinkList(DataType a[],int n)
{
Node <DataType>*r,*s;
first=new Node<DataType>;
r=first;
for (int i=0;i<n;i++)
{
s=new Node<DataType>;
s->data=a[i];
r->next=s;r=s;
}
r->next=NULL;
}
template<class DataType>
LinkList<DataType>::~LinkList()
{
Node<DataType>*q=NULL;
while(first!=NULL)
{
q=first;
first=first->next;
delete q;
}
}
template<class DataType>
void LinkList<DataType>::Insert(int i,DataType x)
{
Node<DataType>*p=first,*s=NULL;
int count=0;
while(p!=NULL&&count<i-1)
{
p=p->next;
count++;
}
if(p==NULL)throw"位置";
else
{
s=new Node<DataType>;
s->data=x;
s->next=p->next;
p->next=s;
}
}
template<class DataType>
DataType LinkList<DataType>::Delete(int i)
{
Node<DataType>*p=first,*q=NULL;
DataType x;
int count=0;
while(p!=NULL&&count<i-1)
{
p=p->next;
count++;
}
if(p==NULL||p->next==NULL)
throw"位置";
else
{
q=p->next;
x=q->data;
p->next=q->next;
delete q;
return x;
}
}
template<class DataType>
int LinkList<DataType>::Locate(DataType x)
{
Node<DataType>*p=first->next;
int count=1;
while(p!=NULL)
{
if(p->data==x)return count;
p=p->next;
count++;
}
return 0;
}
template<class DataType>
int LinkList<DataType>::Get(DataType x)
{
Node<DataType>*p=first->next;
p=first->next; int count=1;
while(p!=NULL&&count<1)
{
p=p->next;
count++;
}
if(p==NULL)throw"位置";
else return p->data;
}
template<class DataType>
void LinkList<DataType>::PrintList()
{
Node<DataType>*p=first->next;
while(p!=NULL)
{
cout<<setw(5)<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
主函数——>>
- #include<iostream>
- #include"LinkList.cpp"
- #include"LinkList.H"
- using namespace std;
- void main()
- {
- int r[5]={75,83,74,92,58};
- LinkList<int>L(r,5);
- cout<<"执行插入成绩操作前数据为:"<<endl;
- L.PrintList();
- try
- {
- L.Insert(2,70);
- }
- catch(char *s)
- {
- cout<<s<<endl;
- }
- cout<<"执行插入成绩操作后数据为:"<<endl;
- L.PrintList();
- try
- {
- L.Delete(3);
- }
- catch(char *s)
- {
- cout<<s<<endl;
- }
- cout<<"输出位置为3的元素为:"<<endl;
- cout<<L.Get(3)<<endl;
- cout<<"输出值为74的位置为:"<<endl;
- cout<<L.Locate(74)<<endl;
- cout<<"执行删除操作成绩后数据为:"<<endl;
- L.PrintList();
- system("pause");
- }
#include<iostream>
#include"LinkList.cpp"
#include"LinkList.H"
using namespace std;
void main()
{
int r[5]={75,83,74,92,58};
LinkList<int>L(r,5);
cout<<"执行插入成绩操作前数据为:"<<endl;
L.PrintList();
try
{
L.Insert(2,70);
}
catch(char *s)
{
cout<<s<<endl;
}
cout<<"执行插入成绩操作后数据为:"<<endl;
L.PrintList();
try
{
L.Delete(3);
}
catch(char *s)
{
cout<<s<<endl;
}
cout<<"输出位置为3的元素为:"<<endl;
cout<<L.Get(3)<<endl;
cout<<"输出值为74的位置为:"<<endl;
cout<<L.Locate(74)<<endl;
cout<<"执行删除操作成绩后数据为:"<<endl;
L.PrintList();
system("pause");
}
以上是用单链表实现=_=