头文件:
#include<iostream.h>
#include"stdlib.h"
typedef int status;
typedef int ElemType;
//链表结点及链表数据表示定义
//双向链表的每个结点需要连接前一个结点和后一个结点,所以需要定义两个指针域,分别指向前一个结点和后一个结点。
typedef struct DualLinkListNode{
ElemType data;
struct DualLinkListNode *prior;
struct DualLinkListNode *next;
}DualLinkListNode,*DualLinkListList;
//以下是双向循环链表操作函数原型
status InitDualLinkListList(DualLinkListList &l); //初始化操作
status CreateDualLinkListList(DualLinkListList &l,int n); //构造指定元素个数的链表
void DestroyDualLinkListList(DualLinkListList &l); //链表销毁操作
void ClearDualLinkListList(DualLinkListList &l); //链表清除操作
int DualLinkListListLength(DualLinkListList l); //链表长度
bool DualLinkListListEmpty(DualLinkListList l); //链表是否为空
status GetDualLinkListListElem(DualLinkListList l,int i,ElemType &e);//取链表中的第i个元素
status InsertDualLinkListList(DualLinkListList &l,int i); //在链表的第i个位置插入元素
status DeleteDualLinkListList(DualLinkListList &l,int i); //删除链表的第i个元素
void PrintDualLinkListList(DualLinkListList l); //打印链表
//初始化操作,初始化时两个指针都指向其自身
status InitDualLinkListList(DualLinkListList &l)
{
cout<<"正在初始化。。。。。。"<<endl;
l=(DualLinkListList)malloc(sizeof(DualLinkListNode));//生成一个DualLinkListNode型的头结点
if(l)
{
l->next=l->prior=l;
cout<<"初始化成功!"<<endl;
return 1;
}
else
{
cout<<"初始化不成功!"<<endl;
return 0;
}
}
//构造指定元素个数的链表
status CreateDualLinkListList(DualLinkListList &l,int n)
{
DualLinkListList p,q=l;
while(n--) //尾插法
{
p=(DualLinkListList)malloc(sizeof(DualLinkListNode));//构造新结点
cout<<"请输入元素:";
cin>>p->data;
q->next=p; //q等同于l,q的next指向p
p->prior=q; //p的prior指向q
p->next=l; //p的next指向l
l->prior=p; //l的prior指向p
q=p;
}
cout<<"链表已产生!"<<endl;
return 1;
}
//打印链表
void PrintDualLinkListList(DualLinkListList l)
{
DualLinkListList p=l->next;
cout<<"存在链表是:";
while(p!=l)
{
cout<<p->data<<",";
p=p->next;
}
cout<<endl;
}
int DualLinkListListLength(DualLinkListList l) //链表长度
{
DualLinkListList p=l->next;
int i=0;
while(p!=l)
{
i++;
p=p->next;
}
return i;
}
//删除链表的第i个元素
status DeleteDualLinkListList(DualLinkListList &l, int i)
{
if( i<1 || i>DualLinkListListLength(l) ) //判断删除位置是否正确
{
cout<<"该链表不存在该位置!删除失败!"<<endl;
return 0;
}
else
{
int k=0;
DualLinkListList p=l->next,q;
while(k<i-1) //循环找到要删除位置的指针
{
p=p->next;
k++;
}
q=p;
q->prior->next = p->next;
q->next->prior = p->prior;
free(p);
cout<<"位置为:"<<i<<"的元素删除成功!"<<endl;
return 1;
}
}
//在链表的第i个位置插入元素
status InsertDualLinkListList(DualLinkListList &l, int i)
{
if( i<1 || i>DualLinkListListLength(l)+1 ) //判断插入位置是否正确
{
cout<<"该链表不存在该位置!插入失败!"<<endl;
return 0;
}
else
{
int k=0;
DualLinkListList p=l->next, q;
while(k < i-1) //循环找到要插入位置的指针
{
p=p->next;
k++;
}
if(!(q=(DualLinkListList)malloc(sizeof(DualLinkListNode))))
{
cout<<"构造结点失败!"<<endl;
return 0;
}
cout<<"构造结点成功,请输入要插入的值:";
cin>>q->data;
q->prior=p->prior;
p->prior->next=q;
q->next=p;
p->prior=q;
cout<<"插入"<<q->data<<"成功!"<<endl;
return 1;
}
}
//取链表中的第i个元素
status GetDualLinkListListElem(DualLinkListList l, int i, ElemType &e)
{
if( i<1 || i>DualLinkListListLength(l) ) //判断查找位置是否正确
{
cout<<"该链表不存在该位置!查找失败!"<<endl;
return 0;
}
else
{
int k=0;
DualLinkListList p=l->next;
while(k<i-1)
{
p=p->next;
k++;
}
e=p->data;
cout<<"位置为"<<i<<"的元素为:"<<e<<endl;
}
return 1;
}
源文件:
#include"DualLinkList.h"
void main()
{
DualLinkListList M;
ElemType e;
InitDualLinkListList(M); //初始化构造头结点
CreateDualLinkListList(M,5);//构造链表
PrintDualLinkListList(M); //输出链表
DeleteDualLinkListList(M,2);//删除指定位置的元素
PrintDualLinkListList(M); //输出链表
InsertDualLinkListList(M,2);//指定位置插入元素
PrintDualLinkListList(M); //输出链表
GetDualLinkListListElem(M, 3, e);//取指定位置的元素
}
执行效果: