//Function realization.cpp
#include "predefined.h"
#include"lianshijiegou.h"
//----线性表的动态分配链式存储结构函数实现---------
Status InitList_L(LinkList *L)//构造一个带头结点的空线性表
{
(*L)=(LinkList)malloc(sizeof(LNode));
if(!L) exit(OVERFLOW);
(**L).next=NULL;
(**L).data=0;
return OK;
}
Status DestroyList_L(LinkList *L)//销毁线性表
{
LinkList p,q;
p=*L;
while(p)
{
p=(**L).next;
free(*L);
(*L)=p;
}
return OK;
}
Status ClearList_L(LinkList *L)//重置线性表为空表,保留头结点
{
LinkList p,q;
p=*L;
if(!p) return FALSE;
p=(*p).next;
while(!p)
{
q=p;
p=(*p).next;
free(q);
}
(**L).next=NULL;
return OK;
}
Status ListEmpty_L(LinkList L)//若为空表,返回TRUE,否则返回FALSE
{
if(!((*L).next)&&L!=NULL) return TRUE;
else return FALSE;
}
Status ListLength_L(LinkList L)//返回表中数据个数
{
ElemType n=0;
LinkList p;
p=L;
while(p=(*p).next) n++;
return n;
}
Status GetElem_L(LinkList L,int i,ElemType *e)//L为带头结点的单链表的头指针。
//算法2.8:当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR。
{
LinkList p;
int j=1;
p=(*L).next;
while(p&&j<i)
{
p=(*p).next;
++j;
}
if(!p||j>i) return ERROR;
*e=(*p).data;
return OK;
}
Status LocateElem_L(LinkList L,ElemType e,Status (*compare)(LinkList L,ElemType e))
//返回L中第一个与e满足关系compare数据元素的位序。若这样的数据元素不存在,则返回0。
{
LinkList p;
p=(*L).next;
Status n;
n=compare(p,e);
if(n) return n;
else return FALSE;
}
Status PriorElem_L(LinkList L,ElemType cur_e,ElemType *pre_e)
//若cur_e是L的数据元素,且不是第一个,则用e返回它的前驱,否则操作失败
{
LinkList p=(*L).next;
Status n;
n=LocateElem_L(L,cur_e,equal);
if(n==1||n==0) return FALSE;
for(int i=2;i<n;i++)
{
p=(*p).next;
}
*pre_e=(*p).data;
return OK;
}
Status NextElem_L(LinkList L,ElemType cur_e,ElemType *next_e)
//若cur_e是L的数据元素,且不是最后一个,则用e返回它的后继,否则操作失败
{
LinkList p=(*L).next;
while((*p).next!=NULL)
{
if((*p).data==cur_e)
{
*next_e=(*(*p).next).data;
return OK;
}
else p=(*p).next;
}
return FALSE;
}
Status ListInsert_L(LinkList *L,int i,ElemType e)
//算法2.9:在带头结点的单链表L中第i个位置之前插入元素e。
{
LinkList p,q;
p=*L;
if(i<1||i>ListLength_L(*L)+1) return FALSE;
for(int j=1;j<i;j++)
{
p=(*p).next;
}
q=(LinkList)malloc(sizeof(LNode));
(*q).data=e;
(*q).next=(*p).next;
(*p).next=q;
return OK;
}
Status ListDelete_L(LinkList *L,int i,ElemType *e)
//算法2.10:在带头结点的单链线性表L中,删除第i个元素,并由e返回其值。
{
LinkList p,q;
p=*L;
for(int j=1;j<i;j++)
{
p=(*p).next;
}
*e=(*(*p).next).data;
q=(*p).next;
(*p).next=(*(*p).next).next;
free(q);
return OK;
}
Status ListTraverse_L(LinkList L,Status (*visit)(LinkList L))
//依次对L中每个元素调用visit函数。
{
LinkList p;
Status m;
p=(*L).next;
while(p!=NULL)
{
m=visit(p);
if(m) p=(*p).next;
else return FALSE;
}
return OK;
}
void CreatList_L(LinkList *L,int n)
//算法2.11逆位序输入n个元素的值,建立带头结点的单链表L。
{
(*L)=(LinkList)malloc(sizeof(LNode));
if(!L) exit(OVERFLOW);
(**L).next=NULL;
(**L).data=0;
LinkList p;
for(int i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode));
printf("▼请输入第%d个数: ",i);
scanf("%d",&(*p).data);
(*p).next=(**L).next;
(**L).next=p;
}
}
#include "prede