[問題] linked list功課卡關-自定義輸出(updated)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++ 2010
問題(Question):
最近大學OOP上機課,出了一道題目,是要求要做一個比較複雜的 linked list
在經過三個小時的哀鴻遍野之後,助教讓大家拿回去慢慢想
這個 linked list 要先自己寫一個 class ZipC,作為存在 list 裡的資料型態
之後再寫一個 class ListZipC 來實作這個 list
除了基本的 linked list 格式以外,還多了 head、cursor、prev 三個指標
class ListZipC 裡的 private struct:
struct node
{
ZipC zc;
node* next;
}*head, *cursor, *prev;
其中 head 永遠指向第一個 node 的位置,cursor 指向測資裡設定的當前 node
prev 則指向 cursor 的前一個 node
其他函式的功能,在程式碼和文件裡有說明
在自己去助教實驗室奮鬥了三個小時之後,總算把 ZipC 寫出來、ListZipC 寫出一點東西
但因對於 linked list 結構的不熟悉、class/struct 結構內指標傳值觀念不清楚
還有極大部分的函式尚未完成
助教建議我可以先把自定義輸出 ListZipC 的 ostream 函式寫出來測試其他寫好的函式
函式是這樣:ostream& operator<<(ostream& ostr, const ListZipC& L){...}
但我不知道到底要怎麼把一串不知道有幾個 node 的 list 一個個印出來
我上網查的簡單 linked list 範例,是已經先設好有幾個 node
每個 node 也有自己的名稱,到時候一個個印出來就好
但這次的並沒有這個條件,想存幾個資料就存幾個資料,因此不能用這種方法印
我現在的想法是設一個 while 迴圈,條件是 head != NULL
每次都印出 head 指到的 node,並把 head 移到 next 指標所指的位置(下一個 node)
但是現在就卡在不知道怎麼把那個"node"叫出來
因此想上來向板友們求救......助教也不能一天24小時開著實驗室讓我盧Q_Q
(也有寄信問助教,但他們還沒回信0.0)
這個問題是第一個,之後可能還會有更多問題,不過走一步算一步了......
不嫌麻煩的話,也請幫我看看 ListZipC 裡待測試的 function 有沒有問題
麻煩大家了......
程式碼(Code):(請善用置底文網頁, 記得排版)
ListZipC.h:http://codepad.org/OKljLuND(所有函式宣告都放在這邊)
ListZipC.cpp:http://codepad.org/cjt3e1oK(所有函式定義都放在這邊)
main.cpp:http://codepad.org/7bhI9Onw(所有測資都放這邊)
功課提供的說明文件:http://www.mediafire.com/view/?d8ss39h2pj9nuzi
補充說明(Supplement):
--
→
11/04 22:52,
11/04 22:52
推
11/04 22:52,
11/04 22:52
推
11/04 22:52,
11/04 22:52
→
11/04 22:52,
11/04 22:52
→
11/04 22:53,
11/04 22:53
→
11/04 22:53,
11/04 22:53
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.133.35.4
推
03/30 21:38, , 1F
03/30 21:38, 1F
對,但是那個不能直接叫出來,得先定義一個 node 型態的東西來叫他
可是 ostream 是在class外面,看不到private資料......
→
03/30 21:39, , 2F
03/30 21:39, 2F
→
03/30 21:42, , 3F
03/30 21:42, 3F
→
03/30 21:42, , 4F
03/30 21:42, 4F
我百分之四十二億九千四百九十六萬七千兩百九十六分同意你的說法!
因此我得想辦法撐過每個上機......ˊˋ
→
03/30 22:15, , 5F
03/30 22:15, 5F
是阿ˊˋ
→
03/30 22:55, , 6F
03/30 22:55, 6F
助教說不能增加別的 class 或 friend function......
是這個意思嗎0.0?
→
03/30 23:58, , 7F
03/30 23:58, 7F
→
03/31 00:09, , 8F
03/31 00:09, 8F
→
03/31 00:10, , 9F
03/31 00:10, 9F
這個方法好像滿好實行的~(雖然要多一條 function 不過管他的)
來試試看......
推
03/31 02:57, , 10F
03/31 02:57, 10F
看不懂,囧。請問可以解釋的更清楚一點嗎0.0?
→
03/31 11:27, , 11F
03/31 11:27, 11F
→
03/31 11:29, , 12F
03/31 11:29, 12F
→
03/31 11:31, , 13F
03/31 11:31, 13F
→
03/31 11:35, , 14F
03/31 11:35, 14F
→
03/31 11:37, , 15F
03/31 11:37, 15F
→
03/31 11:37, , 16F
03/31 11:37, 16F
難道你是哪位助教嗎OAO
→
03/31 11:42, , 17F
03/31 11:42, 17F
喔喔XD
那我就得先把那三個函式先寫出來了(眼神死)
→
03/31 11:49, , 18F
03/31 11:49, 18F
看到另一個一直困擾我的問題了......
像是goNext() 函式中,為了把 cursor 和 prev 往後移,需要把當前和下個 node 叫出來
可是我不知道要怎麼把這兩個 node 叫出來......
現在所有的函式都是卡在這一點,無法進行下去O_O
→
03/31 12:02, , 19F
03/31 12:02, 19F
→
03/31 12:03, , 20F
03/31 12:03, 20F
(慘叫)
我知道要用 head、cursor、prev 來實現這個目標
但也不能直接打什麼 prev.next 之類的東西......所以一直在這裡打轉
現在有一個想法,但不知道語法和規則上可不可行:
在 member function 裡先建幾個 node,把原本 prev、cursor 指著的資料存進去
然後再這樣連過去那樣連過去,達成實作這個函式的目標
可是很怕說這樣根本不會影響到整個list......
→
03/31 12:06, , 21F
03/31 12:06, 21F
??0.0??
→
03/31 13:14, , 22F
03/31 13:14, 22F
報告一下目前進度:
在大家的幫助之下,目前已經把 goNext、rewind、current 三個函式做出來了(待測試)
ostream 的部份,因為用前三個函式會動到 cursor 等指標的位置,會很麻煩
因此採用另外寫一個 member function 存資料,再用 ostream 直接印出來的方式
然後有個小問題是題目要求在輸出時還要把 cursor 現在指的資料前面加一個"@"
雖然再寫一個 member function 就可以解決了,可是這樣感覺好肥大......0.0
※ 編輯: o07608 來自: 220.133.35.4 (03/31 14:57)
報告進度-2
開始測試除了 remove、copy constructor、destructor 和 operator 以外的函式
然後每次跑的時候程式就當了 \0.0/
我好想狠狠的玩五個小時的WOW阿......Q囗Q
※ 編輯: o07608 來自: 220.133.35.4 (03/31 16:40)
把修改過的程式碼重新上傳一次0.0
ListZipC.h:http://codepad.org/yIHe1Z0b
ListZipC.cpp:http://codepad.org/msdc6vkH
※ 編輯: o07608 來自: 220.133.35.4 (03/31 17:12)
報告進度-3
一個問題還沒解決,另一個問題又接著來~
現在在得到samuelcdf板友的建議後,決定改回用rewind、current、goNext實作
先呼叫current來存下cursor指向的位址(我原本以為他是回傳指向的值)
然後用rewind初始化整條list後,用goNext一個個印出來
最後再用原本存的cursor位址把cursor設回去
現在遇到兩個問題:
第一個問題是如何把cursor和prev的位址再設定回去,這個應該再弄一個function就好了
另一個問題才麻煩:rewind的回傳值並不是const,但ostream的引數是const
而助教規定說不准用任何型態轉換把那個const去掉......
我是有想到說可能可以先寫出copy constructor
用它來幫忙,應該還省去重設cursor和prev的麻煩
可是助教恐嚇過我說copy constructor和destructor是最難的,最後再寫......
補上新的程式碼連結:
ListZipC.h:http://codepad.org/8rKTC017
ListZipC.cpp:http://codepad.org/1yTLMcnX
main.cpp:http://codepad.org/BJmYbgMK
※ 編輯: o07608 來自: 220.133.35.4 (03/31 21:58)