//Function realization.cpp
#include"predefined.h"
#include"DoubleLinkList.h"
Status ListInsert_DuL(DuLinkList *L,int i,ElemType e)
//算法2.18:在带头结点的双链循环线性表L中第i个位置之前插入元素e,
//i的合法值为1<=i<=表长+1。
{
DuLinkList p,s;
if(!(p=GetElemP_DuL(*L,i))) return ERROR;
if(!(s=(DuLinkList)malloc(sizeof(DuLNode)))) return ERROR;
(*s).data=e;
(*s).prior=(*p).prior;
(*(*p).prior).next=s;
(*s).next=p;
(*p).prior=s;
return OK;
}
Status ListDelete_DuL(DuLinkList *L,int i,ElemType *e)
//算法2.19:删除带头结点的双链循环表L的第i个元素,i的合法值为1<=i<=表长。
{
DuLinkList p;
if(!(p=GetElemP_DuL(*L,i))) return ERROR;
*e=(*p).data;
(*(*p).prior).next=(*p).next;
(*(*p).next).prior=(*p).prior;
free(p);
return OK;
}
Status InitList_DuL(DuLinkList *L)//构造一个带头结点的空双链表
{
(*L)=(DuLinkList)malloc(sizeof(DuLNode));
if(!(*L)) exit(OVERFLOW);
(**L).next=(**L).prior=*L;
return OK;
}
Status DestroyList_DuL(DuLinkList *L)//销毁双链表
{
DuLinkList p,q;
p=*L;
do
{
q=(*p).next;
free(p);
p=q;
}
while(p!=*L);
(*L)=NULL;
return OK;
}
Status ClearList_DuL(DuLinkList *L)//双链表置空
{
DuLinkList p,q;
p=*L;
if(!p) return FALSE;
p=(*p).next;
while(p!=*L)
{
q=p;
p=(*p).next;
free(q);
}
(**L).next=(**L).prior=*L;
return OK;
}
Status ListEmpty_DuL(DuLinkList L)//若双链表为空,返回TRUE。
{
if(L&&(*L).next==L&&(*L).prior==L) return TRUE;
else return FALSE;
}
Status ListLength_DuL(DuLinkList L)//求双链表L的长度。
{
ElemType n=0;
DuLinkList p;
if(L)
{
p=(*L).next;
while(p!=L)
{
n++;
p=(*p).next;
}
}
return n;
}
Status GetElem_DuL(DuLinkList L,int i,ElemType *e)//用e返回L中第i的元素的值
{
DuLinkList p;
int j=1;
p=(*L).next;
if(L)
{
while(p!=L&&j<i)
{
p=(*p).next;
++j;
}
if(p==L||j>i) return ERROR;
*e=(*p).data;
return OK;
}
else return ERROR;
}
Status LocateElem_DuL(DuLinkList L,ElemType e,Status (*compare)(DuLinkList L,ElemType e))
//返回双链表L中第一个与e满足关系compare元素的位序
{
DuLinkList p;
p=L;
Status n;
n=compare(p,e);
if(n) return n;
else return FALSE;
}
Status PriorElem_DuL(DuLinkList L,ElemType cur_e,ElemType *e)//返回前驱
{
DuLinkList p;
p=(*L).next;
if(L)
{
while(p!=L)
{
if((*p).data==cur_e)
{
if((*p).prior==L) return ERROR;
else
{
*e=(*(*p).prior).data;
return OK;
}
}
p=(*p).next;
}
}
return ERROR;
}
Status NextElem_DuL(DuLinkList L,ElemType cur_e,ElemType *e)//返回后继
{
DuLinkList p;
p=(*L).next;
if(L)
{
while(p!=L)
{
if((*p).data==cur_e)
{
if((*p).next==L) return ERROR;
else
{
*e=(*(*p).next).data;
return OK;
}
}
p=(*p).next;
}
}
return ERROR;
}
DuLinkList GetElemP_DuL(DuLinkList L,int i)
//返回双链表L指向第i个元素的指针。
{
DuLinkList p;
int j;
if(i>ListLength_DuL(L)+1||i<1) return NULL;
p=(*L).next;
for(j=1;j<i;j++)
{
p=(*p).next;
}
return p;
}
Status ListTraverse_DuL(DuLinkList L,Status (*visit)(DuLinkList L))
//依次对双链表L中每个元素调用visit函数。
{
DuLinkList p;
Status m;
p=(*L).next;
while(p!=L)
{
m=visit(p);
if(m) p=(*p).next;
else return FALSE;
}
return OK;
}
//main.cpp
#include"predefined.h"
#include"DoubleLinkList.h"
Status equal(DuLinkList L,ElemType e)
{
int i;
DuLinkList p;
p=(*L).next;
for(i=1;p!=L;i++)
{
if((*p).data==e) return i;
p=(*p).next;
}
return FALSE;
}
Status visit(DuLinkList L)
{
printf("%d ",(*L).data);
return OK;
}
int main()
{
DuLinkList La;
Status s;
int n,i,m;
ElemType e;
printf("Function 1\n★函数InitList_DuL(DuLinkList *L)测试...\n");
s=InitList_DuL(&La);
printf("▲初始化双链循环表La: %d (0:失败 1:成功)\n\n",s);
printf("Function 2\n★函数ListEmpty_DuL(DuLinkList L)测试...\n");
s=ListEmpty_DuL(La);
printf("▲表La是否为空表: %d (0:否 1:是)\n\n",s);
printf("Function 3\n★函数ListInsert_DuL(DuLinkList *L,int i,ElemType e)测试...\n");
printf("▲请输入准备向La输入的个数:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("▲请输入La第%d个数:",i);
scanf("%d",&m);
s=ListInsert_DuL(&La,i,m);
printf("▲插入成功?:%d (1:成功 0:失败)\n",s);
}
printf("\n");
printf("Function 4\n★函数ListTraverse_DuL(DuLinkList L,Status (*visit)(DuLinkList L))测试...\n");
printf("▲La中的元素为:La={");
ListTraverse_DuL(La,visit);
printf("}\n\n");
printf("Function 5\n★函数ListLength_DuL(DuLinkList L)测试...\n");
s=ListLength_DuL(La);
printf("▲La的长度为:%d\n\n",s);
printf("Function 6\n★函数ListDelete_DuL(DuLinkList *L,int i,ElemType *e)测试...\n");
ListDelete_DuL(&La,3,&e);
printf("▲删除La中第3个元素:\"%d\"\n",e);
printf("▲La中的元素为:La={");
ListTraverse_DuL(La,visit);
printf("}\n\n");
printf("Function 7\n★函数GetElem_DuL(DuLinkList L,int i,ElemType *e)测试...\n");
GetElem_DuL(La,3,&e);
printf("▲La中第三个位置元素为 \"%d\"\n\n",e);
printf("Function 8\n★函数LocateElem_DuL(DuLinkList L,ElemType e,Status (*compare)(DuLinkList L,ElemType e))测试...\n");
s=LocateElem_DuL(La,5,equal);
printf("▲La中第一个等于元素\"5\"的位置为 %d\n\n",s);
printf("Function 9\n★函数PriorElem_DuL(DuLinkList L,ElemType cur_e,ElemType *e)测试...\n");
PriorElem_DuL(La,5,&e);
printf("▲La中元素\"5\"的前驱为 %d\n\n",e);
printf("Function 10\n★函数NextElem_DuL(DuLinkList L,ElemType cur_e,ElemType *e)测试...\n");
NextElem_DuL(La,5,&e);
printf("▲La中元素\"5\"的后继为 %d\n\n",e);
printf("Function 11\n★函数ClearList_DuL(DuLinkList *L)测试...\n");
printf("▲La置空前 :");
ListEmpty_DuL(La)?printf("表La为空!!!\n"):printf("表La非空!!!\n");
ClearList_DuL(&La);
printf("▲La置空后 :");
ListEmpty_DuL(La)?printf("表La为空!!!\n"):printf("表La非空!!!\n");
printf("Function 12\n★函数DestroyList_DuL(DuLinkList *L)测试...\n");
printf("▲La销毁前 :");
La?printf("表La存 在!!!\n"):printf("表La不存在!!!\n");
DestroyList_DuL(&La);
printf("▲La销毁后 :");
La?printf("表La存 在!!!\n"):printf("表La不存在!!!\n");
}
//DoubleLinkList.h
typedef struct DuLNode
{
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode,*DuLinkList;
Status ListInsert_DuL(DuLinkList *L,int i,ElemType e);
Status ListDelete_DuL(DuLinkList *L,int i,ElemType *e);
Status InitList_DuL(DuLinkList *L);
Status DestroyList_DuL(DuLinkList *L);
Status ClearList_DuL(DuLinkList *L);
Status ListEmpty_DuL(DuLinkList L);
Status ListLength_DuL(DuLinkList L);
Status GetElem_DuL(DuLinkList L,int i,ElemType *e);
Status LocateElem_DuL(DuLinkList L,ElemType e,Status (*compare)(DuLinkList L,ElemType e));
Status PriorElem_DuL(DuLinkList L,ElemType cur_e,ElemType *e);
Status NextElem_DuL(DuLinkList L,ElemType cur_e,ElemType *e);
DuLinkList GetElemP_DuL(DuLinkList L,int i);
Status ListTraverse_DuL(DuLinkList L,Status (*visit)(DuLinkList L));
Status equal(DuLinkList L,ElemType e);
Status visit(DuLinkList L);
#include "stdio.h"
#include "stdlib.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
注意:双循环链表插入和删除操作和单链表的区别!