//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;
}