數據結構之線性表的合併

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


運行一下結果正確:

我們千萬不可粗心大意,小小的馬虎會給自己帶來很多麻煩!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章