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

《数据结构》实验三:

线性表综合实验

一.实验目的

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

二.实验时间

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

2个学时。

三.实验内容

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

要求如下:

(3)用双链表实现。

#ifndef LinkList_H

#define LinkList_H

template<class DataType>     //定义模板类

struct DulNode

{

DataType data;

DulNode<DataType>*prior,*next;

};

template<class DataType>

class DulLinkList

{

public:

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

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

~DulLinkList();            //析构函数

int Locate(DataType x);

void Insert(int i,DataType x);

DataType Delete(int i);

void PrintList();            

private:

DulNode<DataType>*first;                

};

#endif

#include<iostream>

using namespace std;

template<class DataType>

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

{

DulNode<DataType>*p=first->next;

int count=1;   //工作指针p和累加器count初始化

while(p!=NULL)

{

if(p->data==x)return count; //查找成功,结束函数并返回序号

p=p->next;

count++;

}

return 0;  //退出循环,说明查找失败

}

template<class DataType>

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

{

DulNode<DataType>*p=first,*s=NULL;

int count=0;

while(p!=NULL && count<i-1)  //查找第i-1个结点

{

p=p->next;

count++;

}

if(p==NULL)throw"位置";  //没有找到第i-1个结点

else

{

s=new DulNode<DataType>;s->data=x;  //申请一个结点s,其数据域为x

s->prior=p;

    s->next=p->next;p->next=s;  //将结点s插入到结点p之后

}

}

template<class DataType>

DulLinkList<DataType>::DulLinkList()

{

first=new DulNode<DataType>;  //生成头结点

first->next=NULL;  //头结点的指针域置空

first->prior=NULL;

}

template<class DataType>

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

{   

DulNode<DataType>*r,*s;

first=new DulNode<DataType>;   //生成头结点

r=first;    //尾指针初始化

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

{

s=new DulNode<DataType>;s->data=a[i];  //为每个数组元素建立一个结点

r->next=s;r=s;  //将结点s插入到终端结点之后

}

r->next=NULL;  //单链表建立完毕,将终端结点的指针域置空

}

template<class DataType>

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

{   

DulNode<DataType>*p=first,*q=NULL;

int count=0;

while(p!=NULL && count<i-1)  //查找第i-1个结点

{

p=p->next;

count++;

}

if(p==NULL||p->next==NULL)  //结点p不存在或p的后继结点不存在

throw"位置";

else

{   

DataType x=p->data;

(p->prior)->next=p->next;

(p->next)->prior=p->prior;

delete q;

return x;

}

}

template<class DataType>

DulLinkList<DataType>::~DulLinkList()

{

DulNode<DataType>*q=NULL;

while(first!=NULL)  //释放单链表的每一个结点的存储空间

{

q=first;  //暂存被释放结点

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

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

first=first->next;  //first指向被释放结点的下一结点

delete q;

}

delete first;

}

template<class DataType>

void DulLinkList<DataType>::PrintList()

{

DulNode<DataType>*p=first->next;  //工作指针p初始化

while(p!=NULL)

{

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

p=p->next;   //工作指针p后移

}

cout<<endl;

}

int main()

{

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

DulLinkList <int>L(r,5);

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

L.PrintList();   //输出所有元素

try

{

L.Insert(2,55);   //在第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);   //删除第1个元素

}

catch(char *s)

{

cout<<s<<endl;

}

cout<<"删除后的数据为:"<<endl;

L.PrintList();    //输出所有元素

return 0;

}

运行结果:

 


猜你喜欢

转载自blog.csdn.net/smart_j_king/article/details/80188547