經過兩天,不斷的除錯,不斷的改bug,終於按照自己的思想把哈夫曼樹的建立寫出來了,說實話有點辛苦,但是感覺還不錯,感覺挺有成就感的,在**過程中發現了不少的問題,比如不知為何傳遞過去的是指標,是位址,但是他在主函式的值不會改變,需要使用返回值來改變主函式的值,還有使用遞迴無法直接傳遞最後一輪的值給主函式等等一系列問題。
附**:
1 #include"stdio.h
"2 #include"
stdlib.h"3
//定義哈夫曼節點型別
4 typedef struct
nodehuffman;
10//
初始化哈夫曼
11int length = 0
;12 huffman*creathuffman()
1326
else
2738 p->next =null;
39//
返回h的下乙個節點,h是哈夫曼節點鍊錶的頭結點,這裡直接返回有值的節點就可以了;
40return h->next;41}
42}43//
刪除節點
44 huffman *delnode(huffman *h, int
index)
4554
if(index ==length)
5560 p->next = null; //
因為要刪除的節點是鍊錶中的最後乙個,最後乙個節點的next為null,刪除後就由最後乙個節點的前乙個節點為結束
61 length--;
62return
h;63}64
for(int i = 1; i < index -1; i++) //
移動到要刪除的節點的前乙個
6568 q = p; //
將q指向p的前乙個節點
69 p = p->next; //
p移動到了要刪除的節點
70 q->next = p->next; //
鍊錶中該元素消除
71 length--;
72return
h;73}74
//合併兩個節點,成為乙個新的節點,並將兩個節點作為該節點的左右孩子
75 huffman *mergenode(huffman *h ,huffman *min1, huffman *min2)
7686
else
8792 p->next = newnode; //
將新節點放入節點鍊錶的最後乙個,以便於後面比較大小93}
94 newnode->next =null;
95 length++;
96return
h;97}98
//比較大小,找出兩個最小的值的節點
99 huffman *comparenode(huffman *h)
100106
int index; //
標記最小值的位置
107int count; //
標記當前在第幾個節點
108 huffman *min1,*min2;
109 huffman *p;
110while(h->next !=null)
111125 p = p->next;
126}
127 h = delnode(h, index); //
呼叫刪除節點函式刪除鍊錶中的該節點
128 count = 1; //
節點重頭開始
129 index = 1; //
最小值下標位置置1
130 p = h->next;
131 min2 =h;
132//
尋找第二個最小值
133while(p !=null)
134141 p = p->next;
142}
143 h = delnode(h, index); //
呼叫刪除節點函式刪除鍊錶中的該節點
144 h = mergenode(h , min1, min2);//
呼叫合併節點函式構造乙個新的節點
145146
}147
return
h;148
//h = comparenode(h);
//遞迴呼叫自己
149}
150//
計算總節點個數
151void getlength(huffman *h)
152159
}160
//輸出二叉樹
資料結構 哈夫曼樹 哈夫曼編碼
哈夫曼樹又稱最優樹 二叉樹 是一類帶權路徑最短的樹。構造這種樹的演算法最早是由哈夫曼 huffman 1952年提出,這種樹在資訊檢索中很有用。結點之間的路徑長度 從乙個結點到另乙個結點之間的分支數目。樹的路徑長度 從樹的根到樹中每乙個結點的路徑長度之和。結點的帶權路徑長度 從該結點到樹根之間的路徑...
哈夫曼編碼 哈夫曼樹 (資料結構)
哈夫曼編碼,又稱霍夫曼編碼,是一種編碼方式,哈夫曼編碼是可變字長編碼 vlc 的一種。huffman於1952年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做huffman編碼 有時也稱為霍夫曼編碼 include include inc...
資料結構 哈夫曼樹
哈夫曼樹是二叉樹的一種。被稱為最優二叉樹。實際應用中最重要的是帶權路徑長度。樹的路徑長度 樹中每個結點的路徑長度之和。權 附加在樹節點上,表示出現的概率。樹的帶權路徑長度 所有葉子結點帶權長度之和。看例項 的結點路徑長度 從d到 a的路徑,共走了兩條邊,所以為2。樹中的葉子結點有 d,e和 f。結點...