循环链表,就是把链表给首尾相连,即尾结点的next指向L头结点,而循环双链表不仅尾结点指向头结点,且头结点的prior指向尾结点,判断为空时,只要看尾结点下一个是否指向头结点,循环链表的操作和链表的操作差别并不大。
循环双链表的创建、插入、删除
#include<iostream>
#include<cstdlib>
using namespace std;
typedef int ElemType;
typedef struct CNode{
ElemType data;
struct CNode *next;
struct CNode *prior;
}CNode,*CLinkNode;
void createCLinkNode(CLinkNode &L){
L = (CNode*)malloc(sizeof(CNode));
CLinkNode t,s;
t=L;
ElemType e;
cin>>e;
while(e!=-1){
s=(CLinkNode)malloc(sizeof(CNode));
s->data = e;
t->next = s;
s->prior = t;
t = s;
cin>>e;
}
t->next = L; //
L->prior = t;
}
void print(CLinkNode L){
CLinkNode p = L -> next;
while(p!=L){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
p=L->prior;
while(p!=L){
cout<<p->data<<" ";
p=p->prior;
}
cout<<endl;
}
CLinkNode get(CLinkNode L,int i){
CLinkNode p = L;
int j = 1;
while(p&&j<i){
p=p->next;
j++;
}
return p;
}
void insertCLinkNode(CLinkNode &L,int i){ ///插入到第一个 结点之前
CLinkNode p = get(L,i);
CLinkNode s = (CLinkNode)malloc(sizeof(CNode));
s->data = 999;
s->next = p->next; //s的下一个节点,是原p的下一个结点
p->next->prior = s; //原p的下一个结点的前一个结点变为s
s->prior = p; //s的前一个结点是p
p->next = s;
}
void deleteCLinkNode(CLinkNode &L,int i){ //删除第一个结点
CLinkNode p = get(L,i);
CLinkNode q = p->next;
p->next = q->next;
q->next->prior = p;
}
int main()
{
CLinkNode L;
createCLinkNode(L);
print(L);
insertCLinkNode(L,1);
print(L);
deleteCLinkNode(L,1);
print(L);
return 0;
}
如有错误,敬请指正!