//Function realization.cpp
#include"predefined.h"
#include"ExtenLinkedList.h"
Status MakeNode_E(Link *p,ElemType e)
//分配由p指向的值为e的结点,并返回OK;
//若分配失败,则返回ERROE。
{
(*p)=(Link)malloc(sizeof(LNode));
if(!(*p)) exit(OVERFLOW);
(**p).data=e;
(**p).next=NULL;
return OK;
}
void FreeNode_E(Link *p)
//释放p所指的结点。
{
free(*p);
*p=NULL;
}
Status InitList_E(LinkList *L)
//构造一个空的线性链表L。
{
Link p;
p=(Link)malloc(sizeof(LNode));
if(!p) exit(OVERFLOW);
(*p).next=NULL;
(*p).data=0;
(*L).head=(*L).tail=p;
(*L).len=0;
return OK;
}
Status DestroyList_E(LinkList *L)
//销毁线性链表L,L不再存在。
{
Link p,q;
p=(*L).head;
while(p)
{
q=p;
p=(*p).next;
free(q);
}
(*L).head=(*L).tail=NULL;
(*L).len=0;
return OK;
}
Status ClearList_E(LinkList *L)
//将线性链表L重置为空表,并释放原链表的结点空间。
{
Link p,q;
p=(*(*L).head).next;
while(p)
{
q=p;
p=(*p).next;
free(q);
}
(*(*L).head).next=NULL;
(*L).len=0;
(*L).tail=(*L).head;
return OK;
}
Status InsFirst_E(LinkList *L,Link h,Link s)
//已知h指向线性链表的头结点,将s所指结点插入在第一个结点之前。
{
(*s).next=(*h).next;
(*h).next=s;
(*L).len++;
if((*L).tail==h) (*L).tail=s;
return OK;
}
Status DelFirst_E(LinkList *L,Link h,Link *q)
//已知h指向线性链表的头结点,删除链表中的第一个结点并以q返回。
{
if(!((*h).next)) return ERROR;
if(!(*(*h).next).next) (*L).tail=(*L).head;
*q=(*h).next;
(*h).next=(*(*h).next).next;
(*L).len--;
return OK;
}
Status Append_E(LinkList *L,Link s)
//将指针s所指(彼此以指针相连)的一串结点链接在线性表L的最后一个结点
//之后,并改变链表L的尾指针指向新的尾结点。
{
Link p,q;
int count=0;
p=(*L).tail;
(*p).next=s;
while(s)
{
q=s;
s=(*s).next;
count++;
}
(*L).tail=q;
(*L).len+=count;
return OK;
}
Status Remove_E(LinkList *L,Link *q)
//删除线性链表L中的尾结点并以q返回,改变链表L的尾指针指向新的尾结点。
{
Link p,r;
p=(*L).head;
if(p)
{
while((*p).next)
{
r=p;
p=(*p).next;
}
(*r).next=NULL;
*q=p;
(*L).tail=r;
(*L).len--;
return OK;
}
*q=NULL;
return FALSE;
}
Status InsBefore_E(LinkList *L,Link *p,Link s)
//已知p指向线性链表L中的一个结点,将s所指结点插入在p所指结点之前,
//并修改指针p指向新插入的结点。
{
if(!(*p)||(*L).head==*p||!(*L).head) return ERROR;
Link q,r;
q=(*L).head;
while(!(q==*p))
{
r=q;
q=(*q).next;
if(!q) return ERROR;
}
(*s).next=*p;
(*r).next=s;
*p=s;
(*L).len++;
return OK;
}
Status InsAfter_E(LinkList *L,Link *p,Link s)
//已知p指向线性链表L中的一个结点,将s所指结点插入在p所指结点之后,
//并修改指针p指向新插入的结点。
{
if(!(*p)||!(*L).head) return ERROR;
Link q;
(*s).next=(**p).next;
(**p).next=s;
if(!(**p).next) (*L).tail=s;
*p==s;
(*L).len++;
return OK;
}
Status SetCurElem_E(Link *p,ElemType e)
//已知p指向线性链表中的一个结点,用e更新p所指结点中数据元素的值。
{
if(!(*p)) return ERROR;
(**p).data