循环双链表的示意图:
代码:
CDList.h
#ifndef _CDLIST_H_
#define _CDLIST_H_
typedef char ElemType;
typedef struct DNode
{
ElemType data;
struct DNode *next;
struct DNode *prior;
}DLinkList;
void InitList(DLinkList *&L);
void DestoryList(DLinkList *L);
int ListEmpty(DLinkList *L);
int ListLength(DLinkList *L);
void PrintList(DLinkList *L);
int GetElem(DLinkList *L,int n,ElemType &e);
int LocateElem(DLinkList *L,ElemType e);
int InsertList(DLinkList *&L,int n,ElemType e);
int ListDelete(DLinkList *&L,int n,ElemType &e);
#endif
CDList.cpp
#include<iostream>
#include<malloc.h>
#include"CDList.h"
using namespace std;
void InitList(DLinkList *&L)
{
L=(DLinkList*)malloc(sizeof(DLinkList));
L->prior=L;
L->next=L;
}
void DestoryList(DLinkList *L)
{
DLinkList *p=L,*q=p->next;
while(q!=L)
{
free(p);//头结点也要释放滴
p=q;
q=p->next;
}
free(p);
}
int ListEmpty(DLinkList *L)
{
return (L->next==L);
}
int ListLength(DLinkList *L)
{
DLinkList *p=L->next;
int length=0;
while(p!=L)
{
length++;
p=p->next;
}
return length;
}
void PrintList(DLinkList *L)
{
DLinkList *p=L->next;
while(p!=L)
{
cout<<p->data<<'\t';
p=p->next;
}
cout<<endl;
}
int GetElem(DLinkList *L,int n,ElemType &e)
{
DLinkList *p=L->next;
int i=0;
if(p!=L)//链表不为空
{
if(n==1)
{
e=p->data;
return 1;
}
else//n!=1
{
while(p!=L&&i<n-1)
{
i++;
p=p->next;
}
if(p==L)
return 0;
else
{
e=p->data;
return 1;
}
}
}
else//链表为空
return 0;
}
int LocateElem(DLinkList *L,ElemType e)
{
DLinkList *p=L->next;
int n=1;
while(p->data!=e&&p!=L)
{
n++;
p=p->next;
}
if(p==L)
return 0;//没有找到元素e
else
return n;
}
int InsertList(DLinkList *&L,int n,ElemType e)
{
DLinkList *p=L,*q;
int i=0;
if(p->next==L)//链表为空
{
q=(DLinkList*)malloc(sizeof(DLinkList));
q->data=e;
p->next=q;
q->next=p;
p->prior=q;
q->prior=p;
return 1;
}
else if(n==1)//链表不为空,但在第一个位置插入结点
{
q=(DLinkList*)malloc(sizeof(DLinkList));
q->data=e;
q->next=p->next;
p->next=q;
q->next->prior=q;
q->prior=p;
return 1;
}
else//链表不为空,也不在第一个位置插入结点
{
p=p->next;
while(i<n-2&&p!=L)
{
i++;
p=p->next;
}
if(p==L)//没有找到第n-1个位置
return 0;
else
{
q=(DLinkList*)malloc(sizeof(DLinkList));
q->data=e;
q->next=p->next;
if(p->next!=NULL)//??????
p->next->prior=q;
q->prior=p;
p->next=q;
return 1;
}
}
}
int ListDelete(DLinkList *&L,int n,ElemType &e)
{
DLinkList *p=L,*q;
int i=0;
if(p->next!=L)//链表不为空
{
if(n==1)//删除第一个结点
{
q=L->next;
e=q->data;
q=p->next;
p->next=q->next;
q->next->prior=p;
free(q);
return 1;
}
else
{
p=L->next;
while(i<n-2&&p!=L)
{
i++;
p=p->next;
}
if(p==L)
return 0;
else
{
q=p->next;//q为删除的结点
if(q==NULL)//:??????
return 0;
e=q->data;
p->next=q->next;
if(p->next!=NULL)//???????
p->next->prior=p;
free(q);
return 1;
}
}
}
else
return 0;//链表为空
}
main.cpp
#include<iostream>
#include"CDList.h"
using namespace std;
int main()
{
DLinkList *L;
ElemType e;
cout<<"========================================================================"<<endl;
cout<<"=======对循环双链表进行创建、插入、删除、================================"<<endl;
cout<<"=====对循环双链表进行判断是否为空、求链表长度、打印链表等操作============="<<endl;
cout<<"(1)初始化循环双链表L"<<endl;
InitList(L);
cout<<"(2)依次采用尾插入法插入a,b,c,d,e元素"<<endl;
InsertList(L,1,'a');
InsertList(L,2,'b');
InsertList(L,3,'c');
InsertList(L,4,'d');
InsertList(L,5,'e');
cout<<"(3)输出循环双链表"<<endl;
PrintList(L);
cout<<"(4)循环双链表的长度Length="<<ListLength(L)<<endl;
cout<<"(5)判断循环双链表是否为空"<<endl;
if (ListEmpty(L))
{
cout<<"循环双链表为空"<<endl;
}
else
{
cout<<"循环双链表不为空"<<endl;
}
GetElem(L,3,e);
cout<<"(6)循环双链表L的第3个元素为="<<e<<endl;
cout<<"(7)循环双链表中元素c的位置i="<<LocateElem(L,'c')<<endl;
cout<<"(8)在第4个元素位置上插入f元素"<<endl;
InsertList(L,4,'f');
cout<<"(9)输出循环双链表"<<endl;
PrintList(L);
cout<<"(10)删除循环双链表中的第3个元素"<<endl;
ListDelete(L,3,e);
cout<<"(11)输出循环双链表L"<<endl;
PrintList(L);
cout<<"(12)释放循环双链表L"<<endl;
DestoryList(L);
return 0;
}
结果示意图: