循环双链表,是一种链式存储结构的线性表,它具有两个指针域(一前一后分别是指向当前结点的直接前驱和直接后继),一个数据域。它与普通的双链表不同的是,头结点的直接前驱不再是NULL,而是该双链表的尾结点。而尾结点的直接后继也不再是BULL,而是该双链表的头结点。除了判断表是否为空、遍历表元素等操作的判断条件有所变化其余的操作(如插入,删除等等)和一般的双链表一样。
以下就是循环双链表的代码实现:
C语言(CircularDoubleLinkedList):
#ifndef CIRCULARDOUBLELINKEDLIST_H_INCLUDED
#define CIRCULARDOUBLELINKEDLIST_H_INCLUDED
typedef int ElemType;
typedef struct Node
{
ElemType elem;
struct Node *prior;
struct Node *next;
}LNode,*LinkedList;
void InitList(LinkedList *L)
{
(*L)=(LNode*)malloc(sizeof(LNode));
(*L)->next=(*L);
(*L)->prior=(*L);
}
void DestroyList(LinkedList *L)
{
LNode *p=(*L),*clc;
while(p->next!=(*L))
{
p=p->next;
}
while(p!=(*L))
{
clc=p;
p=clc->prior;
clc->prior->next=clc->next;
clc->next->prior=clc->prior;
free(clc);
clc=NULL;
}
free(*L);
(*L)=NULL;
}
void ClearList(LinkedList *L)
{
LNode *p=(*L),*clc;
while(p->next!=(*L))
{
p=p->next;
}
while(p!=(*L))
{
clc=p;
p=clc->prior;
clc->prior->next=clc->next;
clc->next->prior=clc->prior;
free(clc);
clc=NULL;
}
}
int ListEmpty(LinkedList *L)
{
LNode *p=(*L);
if(p->next==(*L))
{
return 1;
}
else
{
return 0;
}
}
int ListLength(LinkedList *L)
{
LNode *p=(*L);
int i=0;
while(p->next!=(*L))
{
i++;
p=p->next;
}
return i;
}
ElemType GetElem(LinkedList *L,int index)
{
if(index<0||index>=ListLength(L))
{
return -1;
}
int i=0;
LNode *p=(*L)->next;
while(i<index)
{
i++;
p=p->next;
}
return p->elem;
}
int LocateElem(LinkedList *L,ElemType elem)
{
int i=0;
LNode *p=(*L)->next;
while(p!=(*L))
{
if(p->elem==elem)
{
return i;
}
i++;
p=p->next;
}
return -1;
}
ElemType PriorElem(LinkedList *L,ElemType elem)
{
LNode *p=(*L)->next;
while(p!=(*L))
{
if(p->elem==elem)
{
if(LocateElem(L,elem)==0)
{
return p->prior->prior->elem;
}
return p->prior->elem;
}
p=p->next;
}
return -1;
}
ElemType NextElem(LinkedList *L,ElemType elem)
{
LNode *p=(*L)->next;
while(p!=(*L))
{
if(p->elem==elem)
{
if(LocateElem(L,elem)==ListLength(L)-1)
{
return p->next->next->elem;
}
return p->next->elem;
}
p=p->next;
}
return -1;
}
void addFirst(LinkedList *L,ElemType elem)
{
LNode *s,*p=(*L);
s=(LNode*)malloc(sizeof(LNode));
s->elem=elem;
s->next=p->next;
s->next->prior=s;
s->prior=p;
p->next=s;
}
void addAfter(LinkedList *L,ElemType elem)
{
LNode *p=(*L),*s;
s=(LNode*)malloc(sizeof(LNode));
s->elem=elem;
while(p->next!=(*L))
{
p=p->next;
}
s->next=p->next;
s->next->prior=s;
s->prior=p;
s->prior->next=s;
}
int ListInsert(LinkedList *L,int index,ElemType elem)
{
if(index<0||index>ListLength(L))
{
return -1;
}
else
{
LNode *p=(*L),*s;
s=(LNode*)malloc(sizeof(LNode));
s->elem=elem;
int i=0;
while(i<index)
{
p=p->next;
i++;
}
s->next=p->next;
s->next->prior=s;
s->prior=p;
s->prior->next=s;
return 1;
}
}
int ListDelete(LinkedList *L,int index)
{
if(index<0||index>=ListLength(L))
{
return -1;
}
else
{
int i=0;
LNode *p=(*L)->next,*del;
while(i<index)
{
p=p->next;
i++;
}
del=p;
del->prior->next=del->next;
del->next->prior=del->prior;
free(del);
del=NULL;
return 1;
}
}
void TraverseList(LinkedList *L)
{
LNode *p=(*L)->next;
while(p!=(*L))
{
printf("%d\t",p->elem);
p=p->next;
}
printf("\n");
}
void TraverseListByReverseOrder(LinkedList *L)
{
LNode *p=(*L)->next;
while(p->next!=(*L))
{
p=p->next;
}
while(p!=(*L))
{
printf("%d\t",p->elem);
p=p->prior;
}
printf("\n");
}
#endif // CIRCULARDOUBLELINKEDLIST_H_INCLUDED
Java语言:
package DataStructure.LinearList;
public class LinkedList1 {
protected Object elem;
protected LinkedList1 next;
protected LinkedList1 prior;
public LinkedList1(Object elem)
{
this.elem=elem;
}
public LinkedList1(){}
}
package DataStructure.LinearList;
public class CircularDoubleLinkedList {
private LinkedList1 list;
private LinkedList1 head;
public void InitList()
{
list=new LinkedList1();
this.head=list;
head.next=list;
head.prior=list;
head.elem=null;
}
public Boolean DestoryList()
{
try
{
ClearList();
head=null;
return true;
}
catch (NullPointerException e)
{
System.out.println("This DoubleLinkedList has been destoried");
return true;
}
}
public Boolean ClearList()
{
LinkedList1 temp=head;
while (temp.next!=head)
{
temp.elem=null;
temp.prior=null;
temp=temp.next;
}
temp.next=null;
head.next=head;
head.prior=head;
return true;
}
public Boolean ListEmpty()
{
if (head.next!=head)
{
return false;
}
else
{
return true;
}
}
public int ListLength()
{
LinkedList1 temp=head;
int i=0;
while (temp.next!=head)//&&head.prior!=temp
{
i++;
temp=temp.next;
}
return i;
}
public Object GetElem(int index)
{
if(index<0||index>=this.ListLength())
{
return -1;
}
else
{
LinkedList1 temp=head;
int i=0;
while (i<index)
{
i++;
temp=temp.next;
}
return temp.elem;
}
}
public int LocateElem(Object elem)
{
LinkedList1 temp=head;
for(int i=0;i<this.ListLength();i++)
{
if (temp.elem.equals(elem))
{
return i;
}
else
{
temp=temp.next;
}
}
return -1;
}
public Object PriorElem(Object elem)
{
LinkedList1 temp=head;
for(int i=0;i<this.ListLength()-1;i++)
{
if(temp.next.elem.equals(elem))
{
return temp.elem;
}
else if (this.LocateElem(elem)==0)
{
return head.prior.prior.elem;
}
else
{
temp=temp.next;
}
}
return -1;
}
public Object NextElem(Object elem)
{
LinkedList1 temp=head;
for (int i = 0; i < this.ListLength(); i++)
{
if(temp.elem.equals(elem))
{
if (this.LocateElem(elem)==this.ListLength()-1)
{
return temp.next.next.elem;
}
else
{
return temp.next.elem;
}
}
else
{
temp=temp.next;
}
}
return -1;
}
public Boolean ListInsert(Object elem,int index)
{
if(index<0||index>this.ListLength())
{
return false;
}
LinkedList1 temp=head;
LinkedList1 node=new LinkedList1(elem);
if(index==0)
{
addFirst(elem);
}
if(index>0)
{
int i=1;
while(i<index)
{
temp=temp.next;
i++;
}
node.next=temp.next;
temp.next.prior=node;
temp.next=node;
node.prior=temp;
}
return true;
}
public void addFirst(Object elem)
{
LinkedList1 node=new LinkedList1(elem);
LinkedList1 temp=head;
while (temp.next!=head)
{
temp=temp.next;
}
temp.next=node;
node.next=head;
node.prior=temp;
head.prior=node;
head=node;
}
public void addAfter(Object elem)
{
int i=0;
LinkedList1 temp=head;
if (this.ListLength()==0)
{
addFirst(elem);
}
else
{
while (i<this.ListLength()-1)
{
temp=temp.next;
i++;
}
LinkedList1 node=new LinkedList1(elem);
node.next=temp.next;
temp.next.prior=node;
temp.next=node;
node.prior=temp;
}
}
public Boolean DeleteElem(int index)
{
if(index<0||index>this.ListLength()-1)
{
return false;
}
if(index==0)
{
LinkedList1 pre=head.next;
LinkedList1 temp=head;
LinkedList1 node=head;
while (node.next!=head)
{
node=node.next;
}
node.next=pre;
pre.prior=node;
head=pre;
temp.next=null;
temp.prior=null;
return true;
}
else
{
LinkedList1 temp=head;
for (int i = 0; i < index-1; i++) {
temp=temp.next;
}
LinkedList1 delete=temp.next;
temp.next=delete.next;
delete.next.prior=temp;
delete.next=null;//可有可无
delete.prior=null;//可有可无
return true;
}
}
public void TraverseList()
{
LinkedList1 temp=head;
while(temp.next!=head)
{
System.out.print(temp.elem+"\t");
temp=temp.next;
}
System.out.println("");
}
public void TraverseListByReverseOrder()
{
int i=0;
LinkedList1 temp=head;
while (i<this.ListLength()-1)//
{
temp=temp.next;
i++;
}
while (temp!=head.prior)head
{
System.out.print(temp.elem+"\t");
temp=temp.prior;
}
System.out.println("");
}
}