一、 實驗環境
學寶虛擬機器,vc6.0
二、 實驗目的
從鍵盤接收一串電文字元,輸出對應的哈夫曼編碼,同時能翻譯哈夫曼編碼生成的**串,輸出對應的電文字元。
三、 實驗內容
1.用c語言實現二叉樹的鏈式(二叉鍊錶)儲存結構;
2.實現二叉樹的基本操作的有關演算法(二叉樹的建立、各種遍歷等);
3.定義二叉樹的靜態鍊錶結構,並利用這種結構儲存哈夫曼樹,利用哈夫曼樹解決編碼及解碼的實際應用問題。
四、 資料結構與演算法思想描述
(1)建立哈夫曼樹:
若已知n個字元的出現概率的「權值」,構造出具有2n-1個結點的哈夫曼樹(採用靜態鍊錶儲存結構),
(2)編碼:
從哈夫曼樹的葉節點出發,通過雙親找到h[f],通過h[f]的左孩子和右孩子來判斷該葉子是左分支還是右分支。如果是右邊,則為『1』。反之為『0』。放入陣列cd[start]裡,重複上述過程,直至找到樹根。倒序輸出陣列的編碼值。
(3)解碼:
步驟1:設計一迴圈結構接收使用者輸入的二進位制**存入ch[1..m],每迴圈一次接收乙個「0」或「1」,同時記錄**的長度;最後將長度存入m中;設k指標的初值=1;
步驟2:將f指標指向根節點。利用指標k掃瞄到二進位制**ch的第k位,若當前第k位二進位制數ch[k] =「0」則f往其左孩子移動,若ch[k]=「1」,則f往其右孩子移動;f每移動一步時執行一次k++;直到發現f的左孩子(或右孩子)為「空」時,則f遇到葉子結點,列印f所指葉子結點的data中存放的值;
步驟3:當k<=m時,則又轉步驟2,繼續掃瞄二進位制**中的剩餘數字,否則解碼完成,列印回車符後結束程式。
#includetypedef struct node;
typedef structcode;
int create (node *h){
int i,k,n,m1,m2,p1,p2;
printf("請輸入元素個數為:");
scanf("%d",&n);
for(i=1;i
電文編碼解碼 哈夫曼編碼
幫別人改 原 只能輸入定義好輸入字元個數 輸入的字元及每個字元的權重,來生成對應的哈夫曼輸和哈夫曼編碼,以及對應的解碼功能,在原 基礎是修改,能夠根據使用者輸入的字串,計算每個字元的權重,然後生成對應的編碼。temp i 標記陣列儲存末位位置 i 1 printf 輸出哈夫曼解碼 n typedef...
哈夫曼編碼 解碼系統(樹應用)
問題描述 利用哈夫曼編碼進行通訊,可以壓縮通訊的資料量,提高傳輸效率,縮短資訊的傳輸時間,還有一定的保密性。現在要求編寫一程式模擬傳輸過程,實現在傳送前將要傳送的字元資訊進行編碼,然後進行傳送,接收後將傳來的資料進行解碼,即將資訊還原成傳送前的字元資訊。實現提示 在本例中設定傳送者和接受者兩個功能,...
哈夫曼編碼 解碼系統(樹應用)
利用哈夫曼編碼進行通訊,可以壓縮通訊的資料量,提高傳輸效率,縮短資訊的傳輸時間,還有一定的保密性。現在要求編寫一程式模擬傳輸過程,實現在傳送前將要傳送的字元資訊進行編碼,然後進行傳送,接收後將傳來的資料進行解碼,即將資訊還原成傳送前的字元資訊。在本例中設定傳送者和接受者兩個功能,傳送者的功能包括 輸...