12.将两个有序链表并为一个有序链表
void MergeList_L(LinkList &La,LinkList&Lb,LinkList &Lc)
{
//已知单链线性表La和Lb的元素按值非递减排列,归并La和Lb得到新的单链线性表//Lc,Lc的元素也按值非递减排列
pa = La->next;
pb = Lb->next;
Lc = pc =La; //用La的头结点作为Lc的头结点
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的头结点
}
***********************************************************************************************
13.在静态链表中实现定位函数LocateElem如下
int LocateElem_SL(SLinkList S,ElemType e)
{
//在静态单链线性表L中查找第1个值为e的元素,若找到,则返回它在L中的位序,//否则返回0
i =S[0].cur; //i指示表中第一个结点
while(i&&S[i].data!=e)i=S[i].cur;
return i;
}
*************************************************************************************************************
14.以集合运算(A-B)U(B-A)为例讨论静态链表的算法
void InitSpace_SL(SLinkList &space)
{
//将一维数组space中各分量链成一个备用链表,space[0].cur为头指针,0表示空指针
for( i= 0;i <MAXSIZE-1;++i )space[i].cur = i+1;
space[MAXSIZE-1].cur = 0;
}
void Free_SL(SLinkList&space,int k)
{
//将下标为k的空闲结点回收到备用链表
space[k].cur = space[0].cur;space[0].cur =k;
}
void difference(SLinkList&space,int &S)
{
//依次输入集合A和B的元素,在一维数组space中建立表示集合(A-B)U(B-A)的
//静态链表,S为其头指针。假设备用空间足够大,space[0].cur为其头指针
InitSpace_SL(space);//初始化备用空间
S = Malloc_SL(space);//生成S的头结点
r =S;//r指向S的当前最后结点
scanf(m,n);//输入A和B的元素个数
for(j = 1;j<=m;++j
//建立集合A的链表
{
i = Malloc.SL(space);//分配结点
scanf(space[i].data);//输入A的元素值
space[r].cur = i; r = i;//插入到表尾
}
space[r].cur = 0;
for(j = 1;j<=n;++j) //依次输入B的元素,若不在当前表中,则插入,否则删除
{
scanf(b);p=S;k= space[S].cur;//k指向集合A中第一个结点
while(k!=space[r].cur&&space[k].data!=b)
{//在当前表中查找
p = k; k=space[k].cur;
}
if(k ==space[r].cur)
{
//当前表中不存在该元素,插入在r所指结点之后,且r的位置不变
i =Malloc_SL(space);
space[i].data = b;
space[i].cur = space[r].cur;
space[r].cur = i;
}
else{ //该元素已在表中,删除之
space[p].cur=space[k].cur;
Free_SL(space,k);
if(r==k) r=p;//若删除的是r所指结点,则需要修改尾指针
}
}
}
******************************************************************************************************************************
15.在双向链表中插入和删除
StatusListInsert_DuL(DuLinkList &L,int i,ElemType e)
{
//在带头结点的双链循环线性表L中第i个位置之前插入元素e,i的合法值为1<=i<=表长+1
if(!(p=GetElemp_DuL(L,i))) //在L中确定插入位置
return ERROR;//p=NULL,即插入位置不合法
if(!(s =(DuLinkList)malloc(sizeof(DuLNode))))return ERROR;
s->data = e;
s->prior = p->prior;p->prior->next = s;
s->next = p; p->prior =s;
return OK;
}
StatusListDelete_DuL(DuLinkList &L,int i,ElemType &e)
{
//删除带头结点的双链循环线性表L的第i个元素,i的合法值为1<=i<=表长
if(!(p=GetElemp_DuL(L,i)))//在L中确定第i个元素的位置指针
return ERROR;//p=NULL,即第i个元素不存在
e = p->data;
p->prior->next = p->next;
p->next->prior = p->prior;
free(p); return OK;
}