巳知线性表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;
}