=cur_e)
{
i++;
p++;
}
if(i==L、length)
returnINFEASIBLE;
else
{
*next_e=*++p;
returnOK;
}
}
StatusListInsert(SqList*L,inti,ElemTypee)/*算法2、4*/
{/*初始条件:
顺序线性表L已存在,1≤i≤ListLength(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+LISTINCREMENT)*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≤i≤ListLength(L)*/
/*操作结果:
删除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;p<=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;j<=5;j++)/*在表La中插入5个元素*/
i=ListInsert(&La,j,j);
printf("La=");/*输出表La得内容*/
ListTraverse(La,print);
InitList(&Lb);/*也可不判断就是否创建成功*/
for(j=1;j<=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;
ElemTypeai,bj;
InitList(Lc);/*创建空表Lc*/
La_len=ListLength(La);
Lb_len=ListLength(Lb);
while(i<=La_len&&j<=Lb_len)/*表La与表Lb均非空*/
{
GetElem(La,i,&ai);
GetElem(Lb,j,&bj);
if(ai<=bj)
{
ListInsert(Lc,++k,ai);
++i;
}
else
{
ListInsert(Lc,++k,bj);
++j;
}
}
while(i<=La_len)/*表La非空且表Lb空*/
{
GetElem(La,i++,&ai);
ListInsert(Lc,++k,ai);
}
while(j<=Lb_len)/*表Lb非空且表La空*/
{
GetElem(Lb,j++,&bj);
ListInsert(Lc,++k,bj);
}
}
voidprint(ElemType*c)
{
printf("%d",*c);
}
voidmain()
{
SqListLa,Lb,Lc;
intj,a[4]={3,5,8,11},b[7]={2,6,8,9,11,15,20};
InitList(&La);/*创建空表La*/
for(j=1;j<=4;j++)/*在表La中插入4个元素*/
ListInsert(&La,j,a[j-1]);
printf("La=");/*输出表La得内容*/
ListTraverse(La,print);
InitList(&Lb);/*创建空表Lb*/
for(j=1;j<=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;j<=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)、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均非空*/
switch(comp(*pa,*pb))/*此句与算法2、7不同*/
{
case0:
pb++;
case1:
*pc++=*pa++;
break;
case-1:
*pc++=*pb++;
}
while(pa<=pa_last)/*表La非空且表Lb空*/
*pc++=*pa++;
while(pb<=pb_last)/*表Lb非空且表La空*/
*pc++=*pb++;
(*Lc)、length=pc-(*Lc)、elem;/*加此句*/
}
voidprint(ElemType*c)
{
printf("%d",*c);
}
voidmain()
{
SqListLa,Lb,Lc;
intj;
InitList(&La);/*创建空表La*/
for(j=1;j<=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++;
p=p->next;
}
returni;
}
StatusGetElem(LinkListL,inti,ElemType*e)/*算法2、8*/
{/*L为带头结点得单链表得头指针。
当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR*/
intj=1;/*j为计数器*/
LinkListp=L->next;/*p指向第一个结点*/
while(p&&j