数据结构算法—2

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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值