=cur_e)
{
i++;
p++;
}
if(i==L、length)
returnINFEASIBLE;
else
*next_e=*++p;
returnOK;
}
}
StatusListlnsert(SqList*L,inti,ElemTypee)/算法2、4*/
{/*初始条件:
顺序线性表L已存在,1
/*操作结果:
在L中第i个位置之前插入新得数据元素e,L得长度加1*/
ElemType*newbase,*q,*p;
if(i<1||i>(*L)、length+1)/*i值不合法*/
returnERROR;
if((*L)、length>=(*L)、listsize)/*当前存储空间已满,增加分配*/
{
newbase=(ElemType*)realloc((*L)、elem,((*L)listsize+LlSTlNCREMENT)*sizeof(ElemType));
if(!
newbase)
exit(OVERFLOW);/存储分配失败*/
(*L)、elem二newbase;/*新基址*/
(*L)、listsize+二LISTINCREMENT增加存储容量*/
}
q=(*L)、elem+i-1;/*q为插入位置*/
for(p=(*L)、elem+(*L)、length-1;p>=q;--p)/*插入位置及之后得元素右移*/*(p+1)=*p;
*q=e;/*插入e*/
++(*L)、length;/*表长增1*/、returnOK;
}
StatusListDelete(SqList*L,inti,ElemType*e)/*算法2、5*/
{/*初始条件:
顺序线性表L已存在,1
/*操作结果:
删除L得第i个数据元素,并用e返回其值,L得长度减1*/ElemType*p,*q;
if(i<1||i>(*L)、length)/*i值不合法*/
returnERROR;
p=(*L)、elem+i-1;/*p为被删除元素得位置*/
*e=*p;/*被删除元素得值赋给e*/
q=(*L)、elem+(*L)、length-1;/*表尾元素得位置*/
for(++p;pv二q;++p)/*被删除元素之后得元素左移*/
*(p-1)=*p;
(*L)、length--;/*表长减1*/
returnOK;
}
StatusListTraverse(SqListL,void(*vi)(ElemType*))
{/*初始条件:
顺序线性表L已存在*/
/*操作结果:
依次对L得每个数据元素调用函数vi()。
一旦vi()失败,则操作失败*//*vi()得形参加&,表明可通过调用vi()改变元素得值*/
ElemType*p;
inti;
p=L、elem;
for(i=1;i<=L、length;i++)
vi(p++);
printf("\n");
returnOK;
}
Statusequal(ElemTypec1,ElemTypec2)
{/*判断就是否相等得函数,Union()用到*/
if(c1==c2)
returnTRUE;
else
returnFALSE;
}
voidUnion(SqList*La,SqListLb)/算法2、1*/
{/*将所有在线性表Lb中但不在La中得数据元素插入到La中*/
ElemTypee;
intLa_len,Lb_len;
inti;
La_len=ListLength(*La);/*求线性表得长度*/
Lb_len=ListLength(Lb);
for(i=1;i<=Lb_len;i++)
{
GetElem(Lb,i,&e);/*取Lb中第i个数据元素赋给e*/if(!
LocateElem(*La,e,equal))/*La中不存在与e相同得元素,则插入之*/ListInsert(La,++La_len,e);
}
}
voidprint(ElemType*c)
{
printf("%d",*c);
}
voidmain()
{
SqListLa,Lb;
Statusi;
intj;
i=InitList(&La);
if(i==1)/*创建空表La成功*/
for(j=1;jv=5;j++)/*在表La中插入5个元素*/
i=ListInsert(&La,j,j);
printf("La二");/*输出表La得内容*/
ListTraverse(La,print);
InitList(&Lb);/*也可不判断就是否创建成功*/
for(j=1;jv=5;j++)/*在表Lb中插入5个元素*/i=ListInsert(&Lb,j,2*j);
printf("Lb=");/*输出表Lb得内容*/
ListTraverse(Lb,print);
Union(&La,Lb);
printf("newLa=");/*输出新表La得内容*/
ListTraverse(La,print);}
/*algo2-2、c实现算法2、2得程序*/
#include"c1、h"
typedefintElemType;
#include"c2-1、h"
#include"bo2-1、c"
voidMergeList(SqListLa,SqListLb,SqList*Lc)算法2、2*/
{/*已知线性表La与Lb中得数据元素按值非递减排列。
*/
/*归并La与Lb得到新得线性表Lc,Lc得数据元素也按值非递减排列*/inti=1,j=1,k=0;
intLa_len,Lb_len;
E-emTypeaLbj-
一nifLisf(LC)r^wH)}*Lc*、
Lal-enuLis产engfh(La)八
Lbl-enuLis产engfh(Lb)八
whi-e(AHLal-enQOQOAHLbl-en)/**La>»LbM皿EH)}*/宀
GefE-em(LaAQOai)八
Gem-em(Lbjdbj)八
if(aAHbj)
Lisf-nsert(LC++Ka三
+±
e-se
宀
Lisf-nsert(LC++Kbj)八
++"
whi-e(AHLal-en)/**L?
LEH)}^*LbH)}*/宀
亠2_」24
Gem-em(La」++QOaix
Lisf-nsert(LC++Ka三whi-e0AHLbl-en)/**Lb^H)}bn*LaH)}*/宀
Gem-em(Lbj++QObj)八Lisf-nsert(LC++Kbj)八voidp「inf(E-emType*c)
p「inff(=%d=*c)八
voidmaino
宀
SqLis产p&lg
Ik4H宀3U18三亘7HN3689二二525一nifLisf(QOLa)r^wH)}*La*、for5rhAH4j++)/*m»La甘B>4->昌洲*/匚sf-nsert(QOLa・Lau—二)八p「inff(・La!
)r鸯圧*LaliN翊*、
亠3/亠24
ListTraverse(La,print);
InitList(&Lb);/*创建空表Lb*/
for(j=1;jv=7;j++)/*在表Lb中插入7个元素*/
ListInsert(&Lb,j,b[j-1]);
printf("Lb=");/*输出表Lb得内容*/
ListTraverse(Lb,print);
MergeList(La,Lb,&Lc);
printf("Lc=");/*输出表Lc得内容*/
ListTraverse(Lc,print);
}
/*algo2-3、c实现算法2、7得程序*/
#include"c1、h"
typedefintElemType;
#include"c2-1、h"
#include"bo2-1、c"
voidMergeList(SqListLa,SqListLb,SqList*Lc)算法2、7*/
{/*已知顺序线性表La与Lb得元素按值非递减排列。
*/
/*归并La与Lb得到新得顺序线性表Lc,Lc得元素也按值非递减排列*/
ElemType*pa,*pa_last,*pb,*pb_last,*pc;
pa=La、elem;
pb=Lb、elem;
(*Lc)、listsize=(*Lc)length二La、length+Lb、length;/*不用InitList()创建空表Lc*/pc=(*Lc)、elem=(ElemType*)malloc((*Lc)、listsize*sizeof(ElemType));
if(!
(*Lc)、elem)/*存储分配失败*/
exit(OVERFLOW);
pa_last=La、elem+La、length-1;
pb_last=Lb、elem+Lb、length-1;
while(pa<=pa_last&&pb<=pb_last)/*表La与表Lb均非空*/
{/*归并*/
if(*pa<=*pb)
*pc++=*pa++;
else
*pc++=*pb++;
}
while(pa<=pa_last)/*表La非空且表Lb空*/
*pc++=*pa++;/*插入La得剩余元素*/
while(pb<=pb_last)/*表Lb非空且表La空*/
*pc++=*pb++;/*插入Lb得剩余元素*/
}
voidprint(ElemType*c)
{
printf("%d",*c);
voidmain()
{
SqListLa,Lb,Lc;
intj;
InitList(&La);/*创建空表La*/
for(j=1;jv=5;j++)/*在表La中插入5个元素*/
ListInsert(&La,j,j);
printf("La=");/*输出表La得内容*/
ListTraverse(La,print);
InitList(&Lb);/*创建空表Lb*/
for(j=1;j<=5;j++)/*在表Lb中插入5个元素*/
ListInsert(&Lb,j,2*j);
printf("Lb=");/*输出表Lb得内容*/
ListTraverse(Lb,print);
MergeList(La,Lb,&Lc);
printf("Lc=");/*输出表Lc得内容*/
ListTraverse(Lc,print);
}
/*algo2-4、c修改算法2、7得第一个循环语句中得条件语句为开关语句,且当*//**pa=*pb时,只将两者中之一插入Lc。
此操作得结果与算法2、1相同
*/
#include"c1、h"
typedefintElemType;
#include"c2-1、h"
#include"bo2-1、c"
intcomp(ElemTypec1,ElemTypec2)
{
inti;
if(c1i=1;
elseif(c1==c2)
i=0;
else
i=-1;
returni;
}
voidMergeList(SqListLa,SqListLb,SqList*Lc)
{/*另一种合并线性表得方法(根据算法2、7下得要求修改算法2、7)*/
ElemType*pa,*pa_last,*pb,*pb_last,*pc;
pa=La、elem;
pb=Lb、elem;
(*Lc)、listsize=La、length+Lb、length;/*此句与算法2、7不同*/
PC"*LC),e-em''E-emType*)ma--oc((*LC}s=sfsN-e*sizeof(E-emType)=if(一(*LC)丿e-em)exif(OVERFLOW}_pal-asllL^e-em+La-engfh——k八pb—-asllLbAe-em+Lb>-engfh丄whi-e(paAHPal-asQSQOpbAHPbl-asf)/**La>»LbM^H)}*/swifch(comp(*pa「pb))/*乓Q>*M2,7^0*/宀caseppb++case」;pc++H*pa++
break
case;pc++H*pb++whi-e(paAHPal-asf)/**La^H)}bn*LbH)}*/
*pc++H*pa++
whi-e(pbAHPbl-asf)/**Lb^H)}bn*LaH)}*/
*pc++H*pb++
(*LC),-engfhHPC—(*LC),e-emrs'乓Q*_voidprinfmemTypeo
宀
亠8/亠24
printf("%d",*c);
}
voidmain()
{
SqListLa,Lb,Lc;
intj;
InitList(&La);/*创建空表La*/
for(j=1;jv=5;j++)/*在表La中插入5个元素*/
ListInsert(&La,j,j);
printf("La=");/*输出表La得内容*/ListTraverse(La,print);
InitList(&Lb);/*创建空表Lb*/
for(j=1;j<=5;j++)/*在表Lb中插入5个元素*/ListInsert(&Lb,j,2*j);
printf("Lb=");/*输出表Lb得内容*/
ListTraverse(Lb,print);
MergeList(La,Lb,&Lc);
printf("Lc=");/*输出表Lc得内容*/
ListTraverse(Lc,print);
}
/*algo2-5、c实现算法2、11、2、12得程序*/
#include"c1、h"
typedefintElemType;
#include"c2-2、h"
/*c2-2、h线性表得单链表存储结构*/
structLNode
{
ElemTypedata;
structLNode*next;
};
typedefstructLNode*LinkList;/*另一种定义LinkList得方法*/
#include"bo2-2、c"
/*bo2-2、c单链表线性表(存储结构由c2-2、h定义)得基本操作(12个)*/
StatusInitList(LinkList*L)
{/*操作结果:
构造一个空得线性表L*/
*L=(LinkList)malloc(sizeof(structLNode));/*产生头结点,并使L指向此头结点
*/if(!
*L)/*存储分配失败*/
exit(OVERFLOW);
(*L)->next二NULL;/*指针域为空*/
returnOK;
}
StatusDestroyList(LinkList*L)
{/*初始条件:
线性表L已存在。
操作结果:
销毁线性表L*/
LinkListq;
while(*L)
{
q=(*L)->next;
free(*L);
*L=q;
}
returnOK;
}
StatusClearList(LinkListL)/不改变L*/
{/*初始条件:
线性表L已存在。
操作结果:
将L重置为空表*/
LinkListp,q;
p=L->next;/*p指向第一个结点*/
while(p)/*没到表尾*/
{
q=p->next;
free(p);
p=q;
}
L->next二NULL;/*头结点指针域为空*/
returnOK;
}
StatusListEmpty(LinkListL)
{/*初始条件:
线性表L已存在。
操作结果:
若L为空表,则返回TRUE否则返回FALSE*/
if(L->next)/*非空*/
returnFALSE;
else
returnTRUE;
}
intListLength(LinkListL)
{/*初始条件:
线性表L已存在。
操作结果:
返回L中数据元素个数*/
inti=0;
LinkListp=L->next;/*p指向第一个结点*/
while(p)/*没到表尾*/
{
i++;