今天用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;
}
運行一下結果正確:
我們千萬不可粗心大意,小小的馬虎會給自己帶來很多麻煩!!!