//用头指针表示的双向循环链表的一些基本操作实现(带头节点)
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MaxSize 100
typedef struct DuLnode{
int data;
struct DuLnode *prior,*next;
}DuLnode,*DuLinkList;
//初始化循环双链表
int ListInit(DuLinkList &L){
L=new DuLnode;
if(!L) exit(ERROR);
L->prior=L;
L->next=L;
return OK;
}
//查找第i个元素并返回其指针(i不能小于1,但可以大于表长,因为是循环链表,在i>0的情况下总能找到元素)
DuLnode* GetElemP_Dul(DuLinkList L,int i)
{
DuLnode* p;
p = L->next;
if(i<1) return ERROR;
for(int j = 1;j<i;j++)
{
p = p->next;
}
return p;
}
//在第i个位置前插入新节点
int ListInstert_DuL(DuLinkList &L,int i,int e){
DuLnode *p=GetElemP_Dul(L,i);
if(!p) return ERROR;
DuLnode *n=new DuLnode;
n->data=e;
n->prior=p->prior;
n->next=p;
p->prior->next=n;
p->prior=n;
return OK;
}
//尾插法建立循环双链表
void TCreatInsert(DuLinkList &L,int n){
DuLnode *t=L;
for(int i=n;i>0;i--){
DuLnode *p=new DuLnode;
L->prior=p;
t->next=p;
p->prior=t;
p->next=L;
cout<<"请输入要插入的值:";
cin>>p->data;
t=p;
}
}
// 双向循环链表的删除(删除第i个元素,并用e返回)
int ListDelete_L(DuLinkList& L,int i, int &e){
DuLnode *p=GetElemP_Dul(L,i);
if(!p) return ERROR;
p->prior->next=p->next;
p->next->prior=p->prior;
e=p->data;
delete p;
return OK;
}
//从头到尾正向遍历以头节点表示的循环双链表并输出值
void ListTraverse(DuLinkList L){
DuLnode *p=L->next;
if(p==L) cout<<"此链表为空";
else{
while(!(p==L)){
cout<<p->data<<endl;
p=p->next;
}
}
}
int main()
{
DuLinkList L=new DuLnode;
ListInit(L);
//建立一个带头节点的长度为3的双向循环链表
TCreatInsert(L,3);
//在最后一个节点之后插入新节点
//ListInstert_DuL(L,4,10);
int e;
//删除第二个元素,并用e返回
ListDelete_L(L,2,e);
cout<<"被删除的元素的值为"<<e<<endl;
ListTraverse(L);
}