1. 程式人生 > >題目14 歸併連結串列,遞減排列。兩連結串列遞增排列,要求利用原來節點存放歸併後的單鏈表

題目14 歸併連結串列,遞減排列。兩連結串列遞增排列,要求利用原來節點存放歸併後的單鏈表

題目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