[問題] linked list功課卡關-自定義輸出(updated)

看板C_and_CPP作者 (無良記者)時間11年前 (2013/03/30 21:12), 編輯推噓2(2020)
留言22則, 7人參與, 最新討論串1/1
開發平台(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
struct裡面不是就有一個next的指標了嗎?
03/30 21:38, 1F
對,但是那個不能直接叫出來,得先定義一個 node 型態的東西來叫他 可是 ostream 是在class外面,看不到private資料......

03/30 21:39, , 2F
每次建立一個新的node就要把cursor的next指向那個node
03/30 21:39, 2F

03/30 21:42, , 3F
好吧 C++我不熟 不要亂答好了 XD
03/30 21:42, 3F

03/30 21:42, , 4F
助教蠻有心的 好好把握這個課程跟練習 應該會蠻紮實的
03/30 21:42, 4F
我百分之四十二億九千四百九十六萬七千兩百九十六分同意你的說法! 因此我得想辦法撐過每個上機......ˊˋ

03/30 22:15, , 5F
這是正常的linkedlist吧
03/30 22:15, 5F
是阿ˊˋ

03/30 22:55, , 6F
另外做個類別繼承再做operator<<如何?
03/30 22:55, 6F
助教說不能增加別的 class 或 friend function...... 是這個意思嗎0.0?

03/30 23:58, , 7F
自己在ListZipC寫個print function再丟進ostream裡?
03/30 23:58, 7F

03/31 00:09, , 8F
應該說在List class內trace node 把node的資料都丟進
03/31 00:09, 8F

03/31 00:10, , 9F
cstring內,最後return 這串string,在ostream再直接call
03/31 00:10, 9F
這個方法好像滿好實行的~(雖然要多一條 function 不過管他的) 來試試看......

03/31 02:57, , 10F
把const copy出來
03/31 02:57, 10F
看不懂,囧。請問可以解釋的更清楚一點嗎0.0?

03/31 11:27, , 11F
為了不破梗,提示你一下外部函式需要goNext, current,
03/31 11:27, 11F

03/31 11:29, , 12F
rewind方法, 達成印初整個list的目的
03/31 11:29, 12F

03/31 11:31, , 13F
說明文件只有說goNext只在cursor不是null時才會設定
03/31 11:31, 13F

03/31 11:35, , 14F
/改變cursor和prev的值; 而current在cursor等於null時
03/31 11:35, 14F

03/31 11:37, , 15F
似乎也只能傳出null, 因此應該可以做為判斷list結尾的依
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
head, cursor, prev, cursor->next
03/31 12:06, 21F
??0.0??

03/31 13:14, , 22F
goNext中你code if內再加一行cursor = cursor->next
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)
文章代碼(AID): #1HLkJ8zg (C_and_CPP)