//用頭指針表示的雙向循環鏈表的一些基本操作實現(帶頭節點)
#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);
}