[問題] 關於純c的link list 插入

看板C_and_CPP (C/C++)作者 (阿貴)時間15年前 (2011/04/24 20:44), 編輯推噓1(1053)
留言54則, 7人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Linux 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 這個連結串列 我是在外面做好一個準備插入的list 然後丟到插入用的函式 在插入函式裡照理來說要比大小 由小到大 可是如果不用傳雙指標呼叫 在函式跑完之後就會消失了 在純C裡面要如何才有辦法把在MAIN作好的list插進去呀 C++的話因該是用傳參數呼叫 但是我想用C做到 餵入的資料(Input): 3 7 6 1 2 預期的正確結果(Expected Output): 1 2 3 6 7 錯誤結果(Wrong Output): seg fault 程式碼(Code):(請善用置底文網頁, 記得排版) http://codepad.org/jjEkLJxR 補充說明(Supplement): 目前我大概有測出來 錯誤大概是在Insert()裡面 只有叫出*pre這種狀況來比較 不知道是不是不能把雙指標的東西 用一個*叫出來 請各位大人為小的指點迷津一下 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.57.127.41

04/24 20:49, , 1F
為什麼你的 Insert( NULL, &head, &list ) ; 要用 NULL ?
04/24 20:49, 1F

04/24 20:53, , 2F
有一部份會被短路婊...
04/24 20:53, 2F

04/24 20:56, , 3F
而且(**list).data < (**cur).data也重複太多了吧= =
04/24 20:56, 3F

04/24 21:42, , 4F
你的insert大概會變成這樣http://codepad.org/fTgJ35TV
04/24 21:42, 4F

04/24 22:04, , 5F
你在**取一個*只的是位址...
04/24 22:04, 5F

04/24 22:10, , 6F
http://codepad.org/tbcC8ekh 做了點小修改
04/24 22:10, 6F

04/24 22:12, , 7F
firejox兄,你的insert好像漏了他的遞迴
04/24 22:12, 7F

04/24 22:16, , 8F
還有原po,用'*'的時候要確定指標是否抓得到值...
04/24 22:16, 8F

04/24 22:19, , 9F
我看他的遞迴不會被用到呀~~
04/24 22:19, 9F

04/24 22:21, , 10F
會用到,因為他是做insert sort
04/24 22:21, 10F

04/24 22:21, , 11F
所以我就說"他的code會變成那樣"呀
04/24 22:21, 11F

04/24 22:22, , 12F
他的最後一個else if應該要用>=才對
04/24 22:22, 12F

04/24 22:24, , 13F
原來如此,我還以為你是放修改完的code給他看@@"
04/24 22:24, 13F

04/24 22:26, , 14F
假如不用** 這個來做Link List 我會習慣用這個方法
04/24 22:26, 14F

04/24 22:26, , 15F

04/24 22:31, , 16F
沒錯,只要最後把head傳回去,根本不用**這麼麻煩
04/24 22:31, 16F

04/24 22:46, , 17F
感謝各位的回應 我第一個塞NULL代表他上一個沒東西(pre)
04/24 22:46, 17F

04/24 22:48, , 18F
我學C的時候 是已經混到C++的傳參數了
04/24 22:48, 18F

04/24 22:48, , 19F
道士我用想改用C的方式作 才知道C沒有傳參數這東西
04/24 22:48, 19F

04/24 22:49, , 20F
而我之前是用迴圈 但是我想試著做做看遞迴的方式
04/24 22:49, 20F

04/24 22:56, , 21F
04/24 22:56, 21F

04/24 23:00, , 22F
感謝各位 原來不需要大於的狀況呀
04/24 23:00, 22F

04/24 23:03, , 23F
不是不需要@@" 是扣掉"<="之後,就只剩下">"這唯一情形
04/24 23:03, 23F

04/24 23:04, , 24F
@@? 其實大於的狀況有考慮呀 在else處
04/24 23:04, 24F

04/24 23:04, , 25F
所以用遞迴的情況就是">"的時候
04/24 23:04, 25F

04/24 23:12, , 26F
嗯 我了解各位的意思了 感謝
04/24 23:12, 26F

04/24 23:13, , 27F
不過我想請教一下 業界都是用這種回傳頭的方式嗎
04/24 23:13, 27F

04/24 23:13, , 28F
我那種方法會有人用嗎??
04/24 23:13, 28F

04/24 23:14, , 29F
業界通常不自己寫 linked list
04/24 23:14, 29F

04/24 23:19, , 30F
現在覺的回傳頭的方好屌 小弟不才大一 只能想到那樣
04/24 23:19, 30F

04/24 23:23, , 31F
很多Data structure的書都有寫呀...
04/24 23:23, 31F

04/24 23:26, , 32F
我反而覺得回傳head很正常,你用**的做法才屌XD
04/24 23:26, 32F

04/24 23:27, , 33F
大一就能寫成這樣,已經超越我大一的時候很多了...了不起..
04/24 23:27, 33F

04/24 23:27, , 34F
先瞭解什麼是 ADT 比較好, 如果有做好抽象化, 你對LL
04/24 23:27, 34F

04/24 23:27, , 35F
的處理最低最低是以 node 為單位而不是以內部指標為單
04/24 23:27, 35F

04/24 23:28, , 36F
位, 所以參數跟回傳通常是 node* 而不會有 node** 出
04/24 23:28, 36F

04/24 23:29, , 37F
現, 也省得有人用一大堆噁心的 typedefs, 介面都訂好
04/24 23:29, 37F

04/24 23:29, , 38F
才有實作的問題, 你整個都相反
04/24 23:29, 38F

04/24 23:44, , 39F
如果少了typedef就會出現一堆struct XD
04/24 23:44, 39F

04/25 00:15, , 40F
我說的噁心是像這種東西 typedef Node* NodePtr;
04/25 00:15, 40F

04/25 00:15, , 41F
typedef Node** NodePtrPtr;
04/25 00:15, 41F

04/25 00:16, , 42F
改叫 typedef Node** NodeP2Ptr; //和P2P的Node也很合XD
04/25 00:16, 42F

04/25 00:24, , 43F
@_@
04/25 00:24, 43F

04/25 00:29, , 44F
在typedef Node* Nodeptr;前你要怎麼定義Node...
04/25 00:29, 44F

04/25 00:46, , 45F
struct只是小事, 為了去除語言帶來的不便你想當然可以
04/25 00:46, 45F

04/25 00:47, , 46F
我之前都用傳參數 所以不會有指標的困擾
04/25 00:47, 46F

04/25 00:47, , 47F
但是為了自己的惡興趣就...
04/25 00:47, 47F

04/25 00:48, , 48F
但是喜歡上c 研究之後 才知道c要傳參數是用傳指標的方式
04/25 00:48, 48F

04/25 00:49, , 49F
自然而然就把所有傳參都想辦法改成傳指標
04/25 00:49, 49F

04/25 00:51, , 50F
我覺得樓上似乎認為傳參考不會有指標的困擾...
04/25 00:51, 50F

04/25 00:52, , 51F
而且似乎少會去用 return...
04/25 00:52, 51F

04/25 01:05, , 52F
就算是C++也不會全用參數傳吧
04/25 01:05, 52F

04/25 01:50, , 53F
沒錯樓上的指正正是我最近自覺到的
04/25 01:50, 53F

04/25 02:06, , 54F
感謝各位大大地指正 我會盡力去學習的
04/25 02:06, 54F
文章代碼(AID): #1Dj1inJC (C_and_CPP)
文章代碼(AID): #1Dj1inJC (C_and_CPP)