資料結構練習題 2 3 鍊錶拼接 20分

2021-10-24 19:27:56 字數 2152 閱讀 7929

本題要求實現乙個合併兩個有序鍊錶的簡單函式。鍊錶結點定義如下:

struct

listnode

;

struct

listnode

*mergelists

(struct

listnode

*list1,

struct

listnode

*list2)

;

其中list1list2是使用者傳入的兩個按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...