数据结构算法―2

2014-11-24 02:45:29 · 作者: · 浏览: 1

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

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;

}