實驗報告哈夫曼編譯碼系統的設計與實現

2022-07-15 16:00:05 字數 2537 閱讀 8598

資料結構實驗報告

實驗題目:哈夫曼編/解碼系統的設計與實現(該實驗為設計性實驗,共用6個學時)

實驗要求:

1. 問題描述:

利用哈夫曼編碼進行通訊可以大大提高通道利用率,縮短資訊傳輸時間,降低傳輸成本。但是,這要求在傳送端通過乙個編碼系統對待傳資料預先編碼,在接收端將傳來的資料進行解碼(復原)。對於雙工通道(即可以雙向傳輸資訊的通道),每端都需要乙個完整的編/解碼系統。

試為這樣的資訊收發站設計乙個哈夫曼編/解碼系統。

2. 乙個完整的系統應具有以下功能:

1)初始化(initialzation)。從資料檔案中讀入字元及每個字元的權值,建立哈夫曼樹hufftree;

2)編碼(encoding)。用已建好的哈夫曼樹,對檔案中的文字進行編碼形成報文,將報文寫在檔案中;

3)解碼(decoding)。利用已建好的哈夫曼樹,對檔案中的**進行解碼形成原文,結果存入檔案中;

4)輸出(output):輸出及其報文輸出及其原文

[備註]:

1)資料檔案中,元素型別為(字元,權值) , 的建立可以根據使用者輸入的一段原文,通過統計出現的字元及各字元出現的次數(與出現的概率作用相同)而得到。另:為了使輸出的哈夫曼樹不太大,規定報文中只能出現a-h的8個字元,當然對程式稍加修改就可以對出現的所有可輸和字元進行處理。

2)中的內容由使用者在程式執行時從鍵盤隨機輸入得到;

3)中的內容由使用者在程式執行時從鍵盤隨機輸入得到;

在程式執行時建立是為了保證編/解碼系統的通用性;

三.總的設計思想,及環境語言、工具等

總的設計思想:

1.根據實驗要求,先建立檔案和用下面三個函式實現;

void creatdatafile( ); //建立資料檔案

void creattobetran( );//建立原文檔案

void creatcodefile( );//建立報文檔案

2.從檔案中讀出各字元及相應的權值,建立哈夫曼樹ht;

3.根據構造的哈夫曼樹,求相應字元的哈夫曼編碼;

4.從檔案中讀出要翻譯的原文,將其翻譯成譯文存入檔案中

5.從檔案中讀出要翻譯的報文,將其翻譯成原文存入檔案中

環境語言:windows下的microsoft vc++

四、資料結構與模組說明

下面是編譯碼系統中所用的資料結構。

在這個系統中,哈夫曼樹的儲存結構採用順序儲存;其結點結構為:

程式中用到的標頭檔案、型別定義及主要的函式原型如下:

#include""

#include""

#include""

#define char_num 8

typedef struct dfilenode ;// 定義資料檔案的元素型別

typedef struct //赫夫曼樹和赫夫曼編碼的儲存表示

htnode,*huffmantree; // 動態分配陣列儲存赫夫曼樹

huffmantree ht;

void creatdatafile( )//建立資料檔案

void creattobetran( )//建立原文檔案

void creatcodefile( )//建立報文檔案

int min(huffmantree t,int i);// 求無雙親且權值最小的結點,函式void select()呼叫

void select(huffmantree t,int i,int &s1,int &s2);

// s1為最小的兩個值中序號小的那個

void print_huff_tree(huffmantree ht ,int n);

//輸出哈夫曼樹,在必要時呼叫以驗證演算法的正確性

void creathuffmantree( huffmantree &ht, int n);

//建立含n葉子結點的哈夫曼樹,字元及權值在檔案中即初始化

void huffmancoding(huffmantree &ht,int n);

//對有n個葉子結點的哈夫曼樹上的葉子結點進行編碼

void encoding()//編碼:對檔案中的文字進行編碼,放在檔案中

void decoding( );//解碼:對檔案中的報文進行解碼,放在檔案中void output( );//輸出原文和對應的譯文;輸出報文和對應的原文;

五、主要演算法的設計與實現

void creathuffmantree( huffmantree &ht, int n)

fclose(f1);

printf("\n");

for(;i<=m;++i,++p)

for(i=n+1;i<=m;++i)//建n-1個分支結點

}void huffmancoding(huffmantree &ht,int n)

//對有n個葉子結點的哈夫曼樹上的葉子結點進行編碼

free(cd); // 釋放工作空間

}void encoding()//編碼:對檔案中的文字進行編碼,放在檔案中

//printf("\n");

fclose(f1);

fclose(f2);

//f2=fopen("","r");

《哈夫曼編碼解碼課程設計》報告

計算機與資訊工程系 實踐環節名稱 報告 專業 電腦科學與技術 班級學號 姓名 楊明英 報告完成日期 2011 6 10 指導教師 目錄1 問題描述1 2 基本要求1 3 資料結構1 4 總體設計1 5 詳細設計2 5.1主函式 void main2 5.2建立檔案 void jianliwenjia...

資料結構哈夫曼樹編碼解碼課程設計實驗報告

資料結構課程設計 設計題目 哈夫曼樹編碼解碼 目錄在當今資訊 時代,如何採用有效的資料壓縮技術節省資料檔案的儲存空間和計算機網路的傳送時間已越來越引起人們的重視,哈夫曼編碼正是一種應用廣泛且非常有效的資料壓縮技術。哈夫曼編碼是一種編碼方式,以哈夫曼樹 即最優二叉樹,帶權路徑長度最小的二叉樹,經常應用...

資料結構課程設計總結報告哈夫曼編碼解碼

4.3 流程圖 6 1.問題描述 設計乙個利用哈夫曼演算法的編碼和解碼系統,重複地顯示並處理以下專案,直到選擇退出為止。1 初始化 鍵盤輸入字符集大小n n個字元和n個權值,建立哈夫曼樹 2 編碼 利用建好的哈夫曼樹生成哈夫曼編碼 3 輸出編碼 4 顯示哈夫曼樹 5 介面設計的優化 6 設字符集及頻...