struct Lnode // 定义链表类型
{
ElemType data;
struct Lnode *next;
};
typedef struct Lnode *LinkList;
int InitList(LinkList &L) //初始化一个链表
{
L=(LinkList)malloc(sizeof(Lnode));
if(!L)
exit(OVERFLOW);
L->next=NULL;
return OK;
}
int DestroyList(LinkList &L) //销毁链表
{
LinkList q;
while(L)
{
q=L->next;
free(L);
L=q;
}
return OK;
}
int ClearList(LinkList L) //清零操作
{
LinkList p,q;
q=L->next;
while(q)
{
p=q->next;
free(q);
q=p;
}
L->next=NULL;
return OK;
}
int ListEmpty(LinkList L) //判空操作
{
if(L->next==NULL)
return TRUE;
else
return FALSE;
}
int ListLength(LinkList L) //计算链表的长度
{
LinkList p;
int i=0;
p=L->next;
while(p)
{
++i;
p=p->next;
}
return i;
}
int GetElem(LinkList L,int i,ElemType e) //得到第i个元素的数据域
{
LinkList p;
int j=0;
p=L->next;
while(p && j<i-1)
{
p=p->next;
++j;
}
if(j>i || !p)
return ERROR;
else
e=p->data;
return OK;
}
int LocateElem(LinkList L,ElemType e,int (*compare)(ElemType,ElemType))
{ //找到第一个对于E满足函数的数据元素的位置
LinkList p;
int i=0;
p=L->next;
while(p)
{
++i;
if(compare(p->data,e))
return i;
p=p->next;
}
return 0;
}
int InsertList(LinkList L,int i,ElemType e) //在第i个数据元素上插入一个元素
{
LinkList p,s;
int j=0;
p=L;
while(p && j<i-1)
{
p=p->next;
++j;
}
if(!p || j>i)
return ERROR;
s=(LinkList)malloc(sizeof(Lnode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
int DeleteList(LinkList &L,int i,ElemType e) //删除第i个元素
{
LinkList p,q;
int j;
j=0;
p=L;
while(p->next && j<i-1)
{
p=p->next;
++j;
}
if(!p->next || j>i)
return ERROR;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return OK;
}
int ListTraverse(LinkList L,int (*vi)(ElemType))
//对所有链表中的元素进行函数vi操作
{
LinkList p;
p=L->next;
while(p)
{
vi(p->data);
p=p->next;
}
return OK;
}
void MergeList(LinkList La,LinkList Lb,LinkList &Lc)
{ //合并二个非递减的La和Lb得到一个非递减的Lc
LinkList pa,pb,pc;
pa=La->next;
pb=Lb->next;
Lc=pc=La;
while(pa && pb)
{
if(pa->data <= pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pb;
free(Lb);
Lb=NULL;
}