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

数据结构学习笔记(二) 链表之带表头结点的双循环链表基本操作

2018-01-22 15:52 381 查看
以下是带表头节点的双循环链表的基本操作,包括链表的创建、前插、删除、打印以及逆向打印。

#include<iostream>
using namespace std;
//抽象数据类型
typedef int datatype;
typedef struct node
{
datatype data;
struct node *next,*prior;
}DLnode;

//双循环链表的创建
void DLCreate(DLnode* head)
{
datatype x;
DLnode *p,*q;
p=head;
cout<<"请输入创建链表的数据,并以0为结尾:"<<endl;
while(cin>>x,x)
{
q=new DLnode;
q->data=x;
q->prior=p;
q->next=head;
p->next=q;
head->prior=q;
p=q;
}
}

//双循环链表的插入(前插)
void DLInsert(DLnode* head,DLnode* p,datatype x)
{
//生成新结点
DLnode *q=new DLnode;
q->data=x;
//修改指针
q->prior=p->prior;
q->next=p;
p->prior->next=q;
p->prior=q;
}

//双循环链表的删除
void DLDelete(DLnode* head,DLnode* p)
{
p->prior->next=p->next;
p->next->prior=p->prior;
delete p;
}

//打印双循环链表
void Print(DLnode* head)
{
//参数检查
if(head==NULL)
{
cout<<"链表为空!"<<endl;
return;
}
DLnode *p;
p=head->next;
cout<<"链表中的元素为:"<<endl;
while(p!=head)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}

//逆向打印双循环链表
void RePrint(DLnode* head)
{
//参数检查
if(head==NULL)
{
cout<<"链表为空!"<<endl;
return;
}
DLnode *p=head->prior;

while(p!=head)
{
cout<<p->data<<" ";
p=p->prior;
}
cout<<endl;
}

//测试函数
int main()
{
DLnode* head=new DLnode;
int i;
datatype x;
DLCreate(head);
Print(head);
DLnode *p=head;
cout<<"输入要前插的结点编号以及对应的值:"<<endl;
cin>>i>>x;
while(i--)
p=p->next;
DLInsert(head,p,x);
Print(head);
cout<<"输入要删除的结点编号:"<<endl;
p=head;
cin>>i;
while(i--)
p=p->next;
DLDelete(head,p);
Print(head);
cout<<"逆向输出双循环链表:"<<endl;
RePrint(head);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 链表