实验3:用双链表实现

一、实验目的

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

二、实验内容

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

三、实验步骤

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

 

2、相关操作的算法表达

定义双链表类DLinkList,包括插入、删除、查找、输出等基本操作。

插入操作:

1.   工作指针p,s初始化;

2.查找第i-1个结点并使工作指针p指向该节点;

3.若查找不成功,说明插入位置不合理,抛出插入位置非法;

否则:

(1) 生成一个元素值为x的新结点s;

(2)将新结点插入到结点p之后(与单链表有所不同);

删除操作:

1.工作指针p初始化,累加器count初始化;

2.查找第i-1个结点并使工作指针p指向该节点;

3.若p不存在或p的后继结点不存在,抛出插入位置非法;

否则

(1)暂存被删结点和被删元素值;

(2)摘链,将结点p的后继结点从链表上摘下;

(3)释放被删结点

(4)返回被删元素值

查找操作:

(1)按位查找

  1.工作指针p初始化,累加器count初始化;

  2.从头指针出发顺next域逐个结点往下搜索直到某个结点,判断是否为第i个结点。

  3. 若是,则查找成功;否则将工作指针p后移;

  (2)按值查找

   1.工作指针p初始化,累加器count初始化;

   2.对单链表中各元素依次进行比较。查找成功则返回元素序号;否则,返回0表示查找失败;

输出操作:

1.工作指针p初始化;

  2.重复执行下述操作,直到p为空:

  (1)输出结点p的数据域;

  (2)工作结点p后移

源程序如下

#ifndefDLinkList_H

#defineDLinkList_H

constint MaxSize=10;

template<classDataType>

structDulNode

{

    DataType data;

    DulNode<DataType>*prior,*next;

};

 

template<class DataType> 

classDLinkList

public: 

    DLinkLst(); 

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

    ~DLinkList();  //析构函数 

    int Length(); //返回单链表长度 

    void Insert(int i, DataType x); //插入操作,在位置i插入元素 

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

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

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

    void Print();  //遍历操作 

private: 

    DulNode<DataType> *first;  //双链表的头指针 

    int length;   //链的长度计数 

}; 

#endif

#include<iostream>

usingnamespace std;

#include"DLinkList.h"

template<class DataType> 

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

    length=0; 

    first = new DulNode<DataType>; 

    first->next = NULL; 

    first->prior = NULL; 

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

    { 

        DulNode<DataType> *s = newDulNode<DataType>; 

        s->data = score[i]; 

        s->next = first->next;  

        first->next = s; 

    } 

 

template<class DataType> 

DLinkList<DataType>::~DLinkList() 

    while(first->next!=first->prior)  

    { 

        DulNode<DataType> *temp =first;   //临时指针,存储即将释放的节点的指针

        first->prior->next =first->next;  //脱链

        first->next -> prior =first->prior;   

        first = first->next;  //头指针后移

        delete temp;  //释放内存 

    } 

    delete first; 

template<class DataType> 

intDLinkList<DataType>::Length() 

    DulNode<DataType> *p;

    int count; 

    p=first->next;   

    count=0;   

    while(p!=NULL) 

    {   

        p=p->next;   

        count++;   

     }   

    return length; 

 

template<class DataType> 

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

    DulNode<DataType>*p,*s;

    int count;   

    p=first;    

    count=0;   

    while(p!=NULL&&count<i-1)   

    {   

        p=p->next;   

        count++;           

     }   

     if(p==NULL) throw"位置";   

     else 

     {   

       s=new DulNode<DataType>;   

       s->data=x;   

       s->next=p->next;   

       p->next=s;   

     } 

 

template<class DataType> 

DataTypeDLinkList<DataType>::get(int i) 

    DulNode<DataType> *p;

    int count;

    count = 1; 

    p = first->next;  

    while (p != NULL&&count<i) 

    { 

        p = p->next;

         count++; 

    } 

    if (p == NULL)throw"位置非法"; 

    else

         return p->data; 

 

template<class DataType>  

intDLinkList<DataType>::Locate(DataType x) 

    DulNode<DataType> *p;

    int count; 

    p = first->next;

    count = 1; 

    while (p!= NULL) 

    { 

        if (p->data == x)

             return count; 

        p = p->next; 

        count++; 

    } 

    return 0; 

 

template<class DataType>  

DataTypeDLinkList<DataType>::Delete(int i) 

    DulNode<DataType> *p,*q; 

    p = first->next;

    int count, x;

    count = 1; 

    while (p !=NULL&&count<i-1) 

    { 

        p = p->next;

         count++; 

    } 

    if (p == NULL || p->next == NULL)throw"位置非法"; 

    else 

    {   

        q = p->next;   

        x=q->data;   

        if (p->next != NULL) 

        {   

            if(q->next!=NULL)   

        q->next->prior = p; 

            else 

            { 

                p->next=NULL; 

                p->next = q->next; 

                delete q; 

                q = NULL; 

                return x; 

            } 

        } 

        p->next = q->next; 

        delete q;   

        q = NULL;   

        return x; 

    } 

 

template<class DataType> 

voidDLinkList<DataType>::Print() 

    DulNode<DataType> *p; 

    p = first->next; 

    while (p != NULL) 

    { 

          cout<< p->data << " ";

             p= p->next; 

    } 

    cout<<endl;

 

#include<iostream>

#include"DLinkList.cpp"

usingnamespace std;

intmain() 

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

    DLinkList<int>student(score, 5); 

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

    student.Print(); 

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

    student.Insert(2,81); 

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

    student.Print();   

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

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

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

    student.Delete(3);

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

    student.Print();

    return 0;

}

运行结果如图.


猜你喜欢

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