数据结构之线性表的合并

           今天用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;
}


运行一下结果正确:

我们千万不可粗心大意,小小的马虎会给自己带来很多麻烦!!!

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页