信管117223王健数据结构实验三之静态链表

《数据结构》实验三:

线性表综合实验

一.实验目的

巩固线性表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相关知识来解决具体问题。

二.实验时间

准备时间为第 7 周到第 8 周,具体集中实验时间为第 4 周第 2 次课。

2个学时。

三.实验内容

1.建立一个由 n 个学生成绩的顺序表,n 的大小由自己确定,每一个学生的成绩信息由自己确定,实现数据的对表进行插入、删除、查找等操作。分别输出结果。

要求如下:

(4)用静态链表实现。

#include<iostream>   

using namespace std;  

const int MaxSize=100;

  

template<class DataType>  

struct SNode  

{  

    DataType data;  //不确定的数据类型

    int next;  //指针域

};  

   

 template<class DataType>  

 class SLinkList  

 {  

    public:  

        SLinkList();  

        SLinkList(DataType a[],int n);  

        ~SLinkList(){};  

        void Insert(int i,int x);  

        int Locate(DataType x);  

        DataType Delete(int i);  

        void PrintList();  

    private:  

        SNode<DataType>data[MaxSize];  

        int frist,avail;   

 };  

  

 template<class DataType>  

 SLinkList<DataType>::SLinkList()  

 {  

    frist=0;  

    avail=0;  

    data[0].next=-1;  

    for(int i;i<MaxSize-1;i++)  

    {  

        data[i].next=i+1;  

    }  

    data[MaxSize-1].next=-1;  

 }  

   

 template<class DataType>  

 SLinkList<DataType>::SLinkList(DataType a[],int n)  

 {  

    int s;  

    if(n>=MaxSize||n<=0) throw"位置";   

    frist=0;  

    data[0].next=avail=1;  

    for(int i=0;i<MaxSize-1;i++)  

    {  

        data[i].next=i+1;  

    }  

    data[MaxSize-1].next=-1;  

    for(int j=0;j<n;j++)

    {  

        s=avail;  

        data[s].data=a[j];

        avail=data[avail].next;  

    }  

    data[s].next=-1;  

 }  

  

template<class DataType>  

void SLinkList<DataType>::Insert(int i,int x)  

{  

    int s;  

    s=avail;   //利用空闲链的第一个结点

    avail=data[avail].next;   //空闲链的头指针后移

    data[s].data=x;    //将x填入下标为s的结点

    for(int p=0;p<MaxSize-1;p++)  

    {  

        if(p==i)  

        {  

            data[s].next=data[p].next;   //将下标为s的结点插入到下标为p的结点后面

            data[p].next=s;  

        }  

    }  

 }   

     

template<class DataType>  

DataType SLinkList<DataType>::Delete(int i)  

{  

    if(i>0 && i<MaxSize)  

    {  

        int q;  

        i=i-1;  

        q=data[i].next;    //暂存被删结点的下标

        data[i].next=data[q].next;    //摘链

        data[q].next=avail;    //将结点q插在空闲链avail的最前端

        avail=q;    //空闲链头指针avail指向结点q

        return data[q].data;  

  }    

    else   throw"位置";  

}  

    

  template<class DataType>  

  int SLinkList<DataType>::Locate(DataType x)  

  {  

    int count;  

    count=data[frist].next;  

    for(count;count!=-1;count++)  

    {if(data[count].data==x)  

    {  

        return count;  

  }  

    }  

    return 0;  

  }  

   

 template<class DataType>  

 void SLinkList<DataType>::PrintList()  

 {  

    int p;  

    p=data[frist].next;  

    while(p!=-1)  

    {  

        cout<<data[p].data<<" ";  

        p=data[p].next;  

    }

cout<<endl;

 }  

   

 int main()  

 {  

    int r[5]={100,90,80,70,60};  

    SLinkList<int>L(r,5);  

    cout<<"执行插入成绩操作前数据为:"<<endl;  

    L.PrintList();  

    try  

    {  

        L.Insert(2,55);  

     }  

     catch(char*s)  

     {  

        cout<<s<<endl;;  

     }  

     cout<<"执行插入成绩操作后数据为:"<<endl;  

     L.PrintList();  

     cout<<"值为90的元素位置为:";  

     cout<<L.Locate(90)<<endl;  

     cout<<"执行删除第一个学生成绩操作前数据为:"<<endl;  

     L.PrintList();  

     try  

     {  

        L.Delete(1);  

      }   

      catch(char*s)  

      {  

      cout<<s<<endl;  

      }  

      cout<<"执行删除成绩操作后数据为:"<<endl;  

      L.PrintList();   

      return 0;  

 }

运行结果: 


猜你喜欢

转载自blog.csdn.net/smart_j_king/article/details/80188087
今日推荐