今天用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;
}
运行一下结果正确:
我们千万不可粗心大意,小小的马虎会给自己带来很多麻烦!!!