归并两个线性表

巳知线性表LA 和线性表LB 中的数据元素按值非递减有序排列,现要求将LA 和LB 归并为一个新的线性表LC ,且LC 中的元素仍按值非递减有序排列。

   求解:设两个指针:i指向LA中的元素a,  j指向LB中的元素b

          LC中的元素c=a(a<=b时)或者 c=b(a>b)

          LA={3,5,8,11}  LB={2,6,8,9,11,15,20}

         得到LC={  2,3,5,6,8,9,11,15,20 }

基本算法:

 

void  Mergelist(List La,List Lb,List &Lc){

       InitList(Lc);

       i=j=1;k=0;

       La_len=ListLength(La);

       Lb_len=ListLength(Lb);

       while((i<=La_len)&&(j<=Lb_len)){

       GetElem(La,i,ai);

       GetElem(Lb,j,bj);

       if(ai<=bj){ListInsert (Lc,++k,ai); ++i;}

      else{ListInsert(lc,++k,bj); ++j;}

      }// end while

    while(i<=La_len){//Lb为空的情况

          GetElem(La,i++,ai);   

            ListInsert(Lc,++k,ai);

         

      while(j<=Lb_len){//La为空的情况

          GetElem(Lb,j++,bj);

          ListInsert(Lc,++k,bi);

       }

    }

 

 

 

只知道算法是怎么样的,就是不会弄成程序。。查找网上的资料,perfect。。。

终于有点感觉了。。

#include<stdio.h>
#include<stdlib.h>
#define MAXNSIZE 10
typedef struct
{
 int elem[MAXNSIZE];
 int len;
}sqlist;
void merge(sqlist *la,sqlist *lb,sqlist *lc)
{
 int i,j,k;
 i=j=k=0;
 if(la->len +lb->len <=MAXNSIZE)
 {
  while(i<la->len &&j<lb->len )
  {
   if(la->elem[i]<lb->elem [j])
   {
    lc->elem [k]=la->elem [i];
    i++;
    k++;
   }
   else
   {
    lc->elem [k]=lb->elem [j];
    j++;
    k++;
   }
  }
  while(i<la->len )
  {
   lc->elem [k]=la->elem [i];
   i++;
   k++;
  }
  while(j<lb->len )
  {
   lc->elem [k]=lb->elem [j];
   k++;
   j++;
  }
  lc->len =la->len +lb->len ;
 }
 else
  printf("out of bound");
}
void print(sqlist*lc)
{
 int i;
 for(i=0;i<lc->len  ;i++)
  printf("%d ",lc->elem[i]);
}
int main()
{
 sqlist la={{1,2,5,8,9,},5};
 sqlist lb={{2,4,7,18,21},5};
 sqlist lc={0};
 merge(&la,&lb,&lc);
 print(&lc);
 return 0;
}

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值