实验3:用静态链表实现

一、实验目的

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

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

三、实验步骤

1、依据实验内容分别说明实验程序中用到的数据类型的定义:

public:  

    SLinkList();//无参构造函数   

    SLinkList(DataType score[],intn);//带参构造函数   

    ~SLinkList();//空的析构函数     

    void Print();//遍历操作  

    DataType get(int i);//按位查找操作 

扫描二维码关注公众号,回复: 3393605 查看本文章

    int Locate(DataType x);//按值查找操作 

    void Insert(int i, DataTypex);//插入操作 

    void Delete(int i);//删除操作 

private:   

    SNode<DataType>node[Maxsize];//节点    

    int first;   

    int avail;//指向空闲链的头指针   

    int length;//当前静态链表的长度 

源程序如下

#ifndefSLinkList_H

#defineSLinkList_H

constint MaxSize=10;

template<classDataType>

structSNode

{

    DataType data;

    int next;

};

template<classDataType>

classSLinkList

{

    public:

    SLinkList();//无参构造函数   

    SLinkList(DataType score[],int n);//带参构造函数   

    ~SLinkList();//空的析构函数     

    void Print();//遍历操作  

    DataType get(int i);//按位查找操作 

    int Locate(DataType x);//按值查找操作 

    void Insert(int i, DataType x);//插入操作 

    void Delete(int i);//删除操作 

private:   

    SNode<DataType> node[MaxSize];//节点   

    int first;   

    int avail;//指向空闲链的头指针   

    int length;//当前静态链表的长度 

};

#endif 

#include<iostream>

#include<string>

#include"SLinkList.h"

usingnamespace std;

template<classDataType> 

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

    length=0; 

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

    { 

        node[i].next=i+1; 

    } 

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

    avail=2;   

    first=1;   

    node[first].next=-1;   

    for (int j=n-1;j>=0;j--)   

    {   

        if (avail==-1)   

        {   

            break;   

        }   

        int s=avail;   

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

        node[s].data=score[j];//将score[j]填入下标为S的节点   

        node[s].next=node[first].next;//将score[j]插到first后面   

        node[first].next=s;   

        length++;   

    }   

template<classDataType>   

SLinkList<DataType>::~SLinkList()   

{   

 

template<classDataType> 

voidSLinkList<DataType>::Print() 

    int s=node[first].next; 

    for (int i=1;i<=length;i++) 

    { 

        cout<<node[s].data<<""; 

        s=node[s].next; 

    } 

}    

 

template<classDataType> 

DataTypeSLinkList<DataType>::get(int i) 

    if(i<=0||i>length) throw"位置非法"; 

    int p=first; 

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

    { 

        p=node[p].next; 

    } 

    return node[p].data; 

 

template<classDataType> 

intSLinkList<DataType>::Locate(DataType x) 

    int count=0; 

    int p=first; 

    while(node[p].next!=-1) 

    { 

        p=node[p].next; 

        if(node[p].data==x)

             return count+1; 

        count++; 

    } 

    return -1; 

 

template<classDataType> 

voidSLinkList<DataType>::Insert(int i, DataType x) 

    if(i<0||i>length) throw"位置非法"; 

    int p=first; 

    for(int j=1;j<i;j++) 

    { 

         p=node[p].next;

    } 

    int s=node[avail].next; 

    node[avail].data=x;   

    node[avail].next=node[p].next;   

    node[p].next=avail;   

    avail=s;   

    length++; 

 

template<classDataType>

voidSLinkList<DataType>::Delete(int i) 

    if(i<0||i>length+1) throw"位置非法"; 

    int p=first; 

    for(int j=1;j<=i; j++) 

    {   

         p=node[p].next;

    } 

    int q=node[p].next;   

    DataType e=node[p].data;   

    node[p].next=node[q].next;   

    node[q].next=avail;   

    avail=q;   

    length--; 

 

#include<iostream>

usingnamespace std;

#include"SLinkList.cpp"

intmain()

{

 int score[5] = {90,88,75,68,73}; 

    SLinkList<int>student(score, 5); 

    cout << "学  生  成  绩"<<endl; 

    student.Print();

    cout<<endl;

    cout<< "在位置2插入成绩81";

    student.Insert(2,81); 

    cout<<endl;

    cout<<"插入操作后学生成绩为:"<<endl; 

    student.Print();

    cout<<endl;

    cout << "位置4的成绩为:" << student.get(4) << endl; 

    cout << "成绩90所在位置为:" << student.Locate(90) << endl;

    cout<< "删除位置3的学生成绩" <<endl;

    student.Delete(3);

    cout<< "执行删除操作后的学生成绩为:"<< endl;

    student.Print();

    cout<<endl;

    return 0;

}

运行结果如图


猜你喜欢

转载自blog.csdn.net/Ulong_/article/details/80204460