linux2020
目的: 檢驗學員對 linked list 和非連續記憶體操作, bitwise 操作, 指標操作 的認知
1
XOR 運算特性:
以下程式碼是個 XOR linked list 的實作,在這樣的資料結構可表示為:
要往下一格移動時,我們需要前一格在哪和這一格的位置。例如我們現在在 HAT
(1), 已知前一格是 (0),那麼下一格就是 link(1) XOR 0
= 2 XOR 0
= 2,也就是 CAT
。繼續,現在位於 CAT
(2),前一格在 (1),於是下一格就是 link(2) XOR 1
= 2 XOR 1
= 3,亦即 EAT
,依此類推。只要當找出來的下一格是 (0) 就結束。
在 __list
結構體內雖僅有一個 struct __list *addr
指標型態的物件,但卻可實作雙向的 linked list,就是憑藉著上述的實作技巧。XOR linked list 的優勢很顯著,對空間的佔用更為精簡:
隨著資料處理量的增長,效益更明顯:
與尋常作法相比,佔用的儲存空間比值會趨近 。
接著我們嘗試撰寫針對 XOR linked list 的排序程式,採用遞增順序:
請補完上述排序程式碼。
作答區
LL1 = ?
(a)
right
(b)
left
(c)
merge
(d)
XOR(merge, left)
(e)
XOR(merge, right)
(f)
XOR(merge, left->addr)
(g)
XOR(merge, right->addr)
(h)
XOR(merge->addr, left)
(i)
XOR(merge->addr, right)
LL2 = ?
(a)
right
(b)
left
(c)
merge
(d)
XOR(merge, left)
(e)
XOR(merge, right)
(f)
XOR(merge, left->addr)
(g)
XOR(merge, right->addr)
(h)
XOR(merge->addr, left)
(i)
XOR(merge->addr, right)
RR1 = ?
(a)
right
(b)
left
(c)
merge
(d)
XOR(merge, left)
(e)
XOR(merge, right)
(f)
XOR(merge, left->addr)
(g)
XOR(merge, right->addr)
(h)
XOR(merge->addr, left)
(i)
XOR(merge->addr, right)
RR2 = ?
(a)
right
(b)
left
(c)
merge
(d)
XOR(merge, left)
(e)
XOR(merge, right)
(f)
XOR(merge, left->addr)
(g)
XOR(merge, right->addr)
(h)
XOR(merge->addr, left)
(i)
XOR(merge->addr, right)
延伸問題:
test_malloc
/ test_free
呼叫交錯情境。2
考慮以下 singly-linked list 程式:
可透過以下 pointer to pointer 改寫 insert
函式,功能等價但更簡潔,如下:
請補完程式碼。
作答區
AA = ?
(a)
(link)->data < newt->data
(b)
*link->data < newt->data
(c)
(*link)->data < newt->data
(d)
**link->data < newt->data
BB = ?
(a)
link = &(*link)->next
(b)
*link = *link->next
(c)
(*link) = (*link)->next
(d)
link = (*link)->next
延伸問題: