您的位置:首页 > 理论基础 > 数据结构算法

数据结构之线性表的合并

2014-11-19 19:36 99 查看
           今天用C语言实现了数据结构中线性表的合并,即:

      已知La与Lb中的数据元素按照非递减排序,将La,Lb的元素合并到Lc中,要求Lc中的数据元素也按照非递减排列。

最初由于粗心,我是这么写的:

void mergeList3(sqlist * La,sqlist * Lb,sqlist * Lc)
{
//由于不调用已经编写好的函数,所以我们必须自己处理存储空间
// 分配问题,同事自己取得La与Lb的数据元素进行比较
elemtype *la,*lb,*lc;
Lc->size=La->length+Lb->length;
Lc->length=La->length+Lb->length;
la=La->elem;
lb=Lb->elem;
Lc->elem=(elemtype*)malloc(Lc->size*sizeof(elemtype));
if(!Lc->elem)
exit(OVERFLOW2);
lc=Lc->elem;
while((la<=(la+La->length-1))&&(lb<=(lb+Lb->length-1))){
if(*la<=*lb){
*lc++=*la++;
}else{
*lc++=*lb++;
}
}
while(la<=(la+La->length-1)){
*lc++=*la++;
}
while(lb<=(lb+Lb->length-1)){
*lc++=*lb++;
}
return;
}

编译并且运行,我希望输出合并后的表Lc,但是结果如图:



并没有按照我的意愿输出合并后的Lc,我进行了仔细的阅读和错误排查(包括单步执行),还是没有找到,

于是我进行了简单的调试在第一个while循环内的if语句中加了一句,printf("hello");如下

void mergeList3(sqlist * La,sqlist * Lb,sqlist * Lc)
{
//由于不调用已经编写好的函数,所以我们必须自己处理存储空间
// 分配问题,同事自己取得La与Lb的数据元素进行比较
elemtype *la,*lb,*lc;
Lc->size=La->length+Lb->length;
Lc->length=La->length+Lb->length;
la=La->elem;
lb=Lb->elem;
Lc->elem=(elemtype*)malloc(Lc->size*sizeof(elemtype));
if(!Lc->elem)
exit(OVERFLOW2);
lc=Lc->elem;
while((la<=(la+La->length-1))&&(lb<=(lb+Lb->length-1))){
if(*la<=*lb){
printf("hello");
*lc++=*la++;
}else{
*lc++=*lb++;
}
}
while(la<=(la+La->length-1)){
*lc++=*la++;
}
while(lb<=(lb+Lb->length-1)){
*lc++=*lb++;
}
return;
}

运行结果如下:



于是我意思到时循环控制出了问题,仔细检查发现发生了死循环,问题发生在这里:la+La->length-1))&&(lb<=(lb+Lb->length-1;这是一个简单的逻辑,
每次la都会增加,当然while循环也就不会终止。

改正如下,

void mergeList2(sqlist * La,sqlist * Lb,sqlist * Lc)
{
/*由于不调用已经编写好的函数,所以我们必须自己处理存储空间
分配问题,同事自己取得La与Lb的数据元素进行比较
*/
elemtype *la,*lb,*lc;
Lc->size=La->length+Lb->length;
Lc->length=La->length+Lb->length;
la=La->elem;
lb=Lb->elem;
Lc->elem=(elemtype*)malloc(Lc->size*sizeof(elemtype));
if(!Lc->elem)
exit(OVERFLOW2);
lc=Lc->elem;
while((la<=(La->elem+La->length-1))&&(lb<=(Lb->elem+Lb->length-1))){
if(*la<=*lb){
*lc++=*la++;
}else{
*lc++=*lb++;
}
}
while(la<=(La->elem+La->length-1)){
*lc++=*la++;
}
while(lb<=(Lb->elem+Lb->length-1)){
*lc++=*lb++;
}
return;
}

运行一下结果正确:



我们千万不可粗心大意,小小的马虎会给自己带来很多麻烦!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息