本題要求實現乙個合併兩個有序鍊錶的簡單函式。鍊錶結點定義如下:
struct
listnode
;
struct
listnode
*mergelists
(struct
listnode
*list1,
struct
listnode
*list2)
;
其中list1
和list2
是使用者傳入的兩個按data
公升序鏈結的鍊錶的頭指標;函式mergelists
將兩個鍊錶合併成乙個按data
公升序鏈結的鍊錶,並返回結果鍊錶的頭指標。
#
include
#include
struct
listnode
;struct
listnode
*createlist()
;/*裁判實現,細節不表*/
struct
listnode
*mergelists
(struct
listnode
*list1,
struct
listnode
*list2)
;void
printlist
(struct
listnode
*head )
printf
("\n");
}int
main()
/* 你的**將被嵌在這裡 */
135
7-12
46-1
123
4567
和2-1的求多項式和思路大致一樣,建立head來儲存頭指標的值,tmp在每個迴圈中將該儲存的資料儲存在tmp結點中,prior用來連線每個tmp結點;注意判斷迴圈結束的標準應該是指標為null,而不是像我最開始一樣,憨的以為-1是每個鍊錶的最後乙個值,用data != -1作為標準。
按照這個演算法,最後返回的指標應該是head->next,而不是head.
struct
listnode
*head =
null
,*tmp,
*prior;
prior =
(struct
listnode*)
malloc
(sizeof
(struct
listnode))
; head = prior;
//儲存頭指標的值,結束時返回
while
(list1 !=
null
&& list2 !=
null
)else
prior->next = tmp;
prior = tmp;}if
(list1)
prior->next = list1;
if(list2)
prior->next = list2;
return head->next;
//head後的第乙個結點是空的,head->next為實際頭指標
}
寫完後覺得tmp結點建立的意義不大,每個迴圈中都要多分配一次結點空間,不如直接使用prior連線原list1、list2鍊錶,既省空間又減少了時間,所以做出了如下的改進。struct
listnode
*mergelists
(struct
listnode
*list1,
struct
listnode
*list2)
else}if
(list1)
prior->next = list1;
if(list2)
prior->next = list2;
head = head->next;
//head後的第乙個結點是空的,head->next為實際頭指標
return head;
}
資料結構 鍊錶 練習題1
2.已知乙個帶表頭結點的單鏈表,結點結構為data link,假設該鍊錶只給出了頭指標list。在不改變鍊錶的前提下,請設計乙個盡可能高效的演算法,查詢鍊錶中倒數第k個位置上的結點 k正為整數 若查詢成功,演算法輸出該結點的data域的值,並返回1 否則,只返回0.要求 1 描述演算法的基本設計思想...
資料結構 鍊錶基礎練習題
1 反轉鍊錶 定義乙個函式,輸入乙個鍊錶的頭節點,反轉該鍊錶並輸出反轉後鍊錶的頭節點。definition for singly linked list.function listnode val param head return var reverselist function head ret...
資料結構練習題
設pa,pb分別指向兩個帶頭結點的有序 從小到大 單鏈表。仔細閱讀如下的程式,並回答問題 1 程式的功能 2 s1,s2中值的含義 3 pa,pb中值的含義。include include typedef struct list list void exam list pa,list pb else...