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

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

2015-01-01 20:29 134 查看

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

一..实验目的

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

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题可以作为选做题。

首先是头文件:

[cpp]
view plaincopyprint?

#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;
};
显然说书本上有,,不过哥已经弄通了。。


接着是程序代码-->>

[cpp]
view plaincopyprint?

#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; 
10351
 
}  
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;
}
主函数-->>

[cpp]
view plaincopyprint?

#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");
}
执行结果=_=



以上是用顺序表,接下来使用单链表-->>
头文件-->>

[cpp]
view plaincopyprint?

#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
程序文件-->>

[cpp]
view plaincopyprint?

#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;
}
主函数——>>

[cpp]
view plaincopyprint?

#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");
}
以上是用单链表实现=_=
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++