題目14 歸併連結串列,遞減排列。兩連結串列遞增排列,要求利用原來節點存放歸併後的單鏈表
阿新 • • 發佈:2018-11-17
題目14:歸併連結串列,遞減排列。兩連結串列遞增排列,要求利用原來節點存放歸併後的單鏈表
void merge_ByDesc(Node *&a, Node *&b, Node *&n){ //新連結串列遞減排列,故可以採用頭插法-假設均帶頭節點 Node *p=a->next, *q=b->next, *r, *m; r=n=a; r->next = NULL; free(b); while(p!=NULL and q!=NULL){ if(p->num<q->num){ m = p->next; p->next = r->next; r->next = p; p = m; }else{ m = q->next; q->next = r->next; r->next = q; q = m; } } while(p!=NULL){ m = p->next; p->next = r->next; r->next = p; p = m; } while(q!=NULL){ m = q->next; q->next = r->next; r->next = q; q = m; } }
主函式:
主函式中,不需要定義具體的頭節點,有指標指向就可以了,void merge_ByDesc(Node *&a, Node *&b, Node *&n)函式中傳入的是該指標的地址,故而可以修改其內容。
題目15:兩連結串列,值相等的元素產生新連結串列,其中兩連結串列遞增有序
void find_SameNode(Node *a, Node *b, Node *&n){ Node *p=n=(Node*)malloc(sizeof(Node)), *q; p->next = NULL; a = a->next; b = b->next; while(a!=NULL){ //這裡的寫法錯誤 if(a->num<b->num){ a = a->next; }else if(a->num>b->num){ b = b->next; }else{ q=(Node*)malloc(sizeof(Node)); q->num = a->num; q->next = p->next; p->next = q; p = q; a = a->next; b = b->next; } } }
錯誤的原因:如果資料是:a={100,200,300} b={1,2,3}那麼迴圈就會一直執行,所以這裡的邏輯錯誤。應該是:while(a!=NULL and b!=NULL){}
題目16:連結串列AB,求交集,其中兩連結串列遞增有序,結果放入A中
交集的結果存放在a中:
小技巧:演算法不宜直接使用一個指向a的指標,直接和b中的每個元素去判斷,然後去刪除不滿足條件元素。而是採用定義一個新的邏輯的指標r為(虛擬第三個)新連結串列的頭節點,然後去完成刪除、加鏈操作。這樣程式碼邏輯簡單,不宜出錯。程式設計的關鍵是理清程式碼的邏輯,然後表達。
void find_SameNode(Node *&a, Node *b){
Node *p, *q, *r;
r = a;
p = a->next;
r->next = NULL;
b = b->next;
while(b!=NULL and p!=NULL){
if(p->num<b->num){
q = p;
p = p->next;
free(q);
}else if(p->num>b->num){
b = b->next;
}else{
q = p;
p = p->next;
q->next = r->next;
r->next = q;
r = q;
b = b->next;
}
}
while(p!=NULL){
q = p;
p = p->next;
free(q);
}
r->next = NULL;
}
作者:無涯明月
志:將懶惰歸結於迷茫,將不思進取歸結為安於現狀;是可悲還是可笑,亦或是可怕。
發文時間:2018-10-21