[問題] C語言的huffmancode問題....

看板C_and_CPP (C/C++)作者時間15年前 (2011/04/12 00:38), 編輯推噓4(4031)
留言35則, 3人參與, 最新討論串1/1
目前做了一個huffman code 主要是把記事本santaclaus.txt裡面的英文與換行跟空白去做統計然後給codeword 目前統計也成功了,鏈結串列的地方也對了 但是在要給codeword的副程式卻一直卡在 while((startnode->leftnode!=NULL)&&(startnode->rightnode!=NULL)) 這一行發生錯誤 執行的時候就一直說這行發生違規 我在想是不是因為我寫的程式沒辦法判斷leftnode跟rightnode是否到達最底部 這一行的錯誤讓我卡了好幾天...都不知道要怎麼樣debug才能成功 希望能有高手幫我解答...感謝!! 程式碼如下 http://pastie.org/1783395 感謝剛剛推文的網友.... 希望能有高手指點迷津 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.240.223.137

04/12 00:41, , 1F
oh no, 你還是用置底文網址貼code吧
04/12 00:41, 1F
※ 編輯: aabbkk 來自: 111.240.223.137 (04/12 00:44)

04/12 00:48, , 2F
基本上就是你得先判斷startnode是不是NULL才存取它的
04/12 00:48, 2F

04/12 00:49, , 3F
member啊, 或者也可以考慮在遞迴呼叫前先判斷
04/12 00:49, 3F

04/12 00:50, , 4F
->leftnode與->rightnode是不是NULL....@_@"
04/12 00:50, 4F

04/12 00:50, , 5F
可是很奇怪的就是我在判斷式下面加printf剛開始也有出來
04/12 00:50, 5F

04/12 00:52, , 6F
在走到leaf之前都還能正常走到很合理啊, 但是已經是leaf
04/12 00:52, 6F

04/12 00:52, , 7F
等到判斷出leftnode到NULL的時候卻沒辦法印出codeword...
04/12 00:52, 7F

04/12 00:53, , 8F
你還拿->left/rightnode的位址送下去遞迴, 又不先判斷
04/12 00:53, 8F

04/12 00:53, , 9F
node是否為NULL, 那只要access下去自然就炸啦@_@"
04/12 00:53, 9F

04/12 00:56, , 10F
話說, 是小弟的錯覺嗎?? malloc來的code[], 即codeword
04/12 00:56, 10F

04/12 00:56, , 11F
所以要在獨立寫一個判斷node的判斷式囉...程式能力不太好
04/12 00:56, 11F

04/12 00:57, , 12F
一遇到這種比較多的內容就整個炸掉了....
04/12 00:57, 12F

04/12 00:57, , 13F
裡用的hufhman[]似乎空間不夠吧?? 只有一個char的空間,
04/12 00:57, 13F

04/12 00:57, , 14F
根本不夠你遞迴寫入level=1的case啊....@_@"
04/12 00:57, 14F

04/12 00:58, , 15F
你可以考慮先畫流程圖寫虛擬碼, 搭配紙筆模擬一遍XD
04/12 00:58, 15F

04/12 00:58, , 16F
我malloc的觀念很薄...我是不太懂到底要給他多大他才能夠存
04/12 00:58, 16F

04/12 00:59, , 17F
像是前面的currnode給大小很簡單,只要給struct就好
04/12 00:59, 17F

04/12 00:59, , 18F
但是如果要建立這種codeword長度不一的,到底要怎麼給呢...
04/12 00:59, 18F

04/12 01:01, , 19F
小弟我只略懂霍夫曼的概念, 不太懂細節也沒自己實作過,
04/12 01:01, 19F

04/12 01:02, , 20F
但就簡單的錯誤排除上, 你可以先考慮給一個一定夠大的,
04/12 01:02, 20F

04/12 01:03, , 21F
那如果今天要給空間配置,是要根據他的code數量做定義嗎?
04/12 01:03, 21F

04/12 01:03, , 22F
然後再從規律或理論推導, 找出正確該開的大小:)
04/12 01:03, 22F

04/12 01:05, , 23F
至於整個實作邏輯正不正確, 就有勞板上其他大大們了^^||
04/12 01:05, 23F

04/12 01:06, , 24F
感謝你指點迷津....雖然對空間配置不太懂
04/12 01:06, 24F

04/12 01:07, , 25F
但我會盡量做做看...如果還有其他地方出錯也希望能夠指導
04/12 01:07, 25F

04/12 01:10, , 26F
一定有辦法從數學上算出來code需要多大的, 我的意思是不
04/12 01:10, 26F

04/12 01:12, , 27F
會算的話, 就先給個很大的數試試(比如要個1M的char XD).
04/12 01:12, 27F

04/12 01:16, , 28F
正在努力try當中...
04/12 01:16, 28F

04/12 09:37, , 29F
還是不行...頂多做出一個node的codeword....
04/12 09:37, 29F

04/12 20:40, , 30F
另外發現, 90與91行那兩個 current= 非常不對勁....
04/12 20:40, 30F

04/12 20:54, , 31F
只有一個node的codeword? 是指只能秀出某個leaf?
04/12 20:54, 31F

04/12 20:54, , 32F
總之run time error除掉以後, 剩下的就是你自己要檢查
04/12 20:54, 32F

04/12 20:55, , 33F
與除錯, 看你演算法實作正不正確, 最好能分步驟驗證:)
04/12 20:55, 33F

04/12 23:06, , 34F
我是想說告訴current第一個指向的位置是哪裡,接下來在做
04/12 23:06, 34F

04/12 23:06, , 35F
鏈結串列去把node連接起來
04/12 23:06, 35F
文章代碼(AID): #1DeowN_K (C_and_CPP)
文章代碼(AID): #1DeowN_K (C_and_CPP)