資源簡介
數據結構課程設計用哈夫曼編碼實現文件壓縮:
一、實驗題目:
用哈夫曼編碼實現文件壓縮
二、實驗目的:
1、了解文件的概念。
2、掌握線性鏈表的插入、刪除等算法。
3、掌握Huffman樹的概念及構造方法。
4、掌握二叉樹的存儲結構及遍歷算法。
5、利用Huffman樹及Huffman編碼,掌握實現文件壓縮的一般原理。
三、實驗設備與環境:
微型計算機、Windows 系列操作系統 、Visual C++6.0軟件
四、實驗內容:
根據ASCII碼文件中各ASCII字符出現的頻率情況創建Haffman樹,再將各字符對應的哈夫曼編碼寫入文件中,實現文件壓縮。
五、概要設計:
1、數據結構類型定義
/*****Huffman結構定義**********/
typedef struct node
{
long w;//w為權值
short p,l,r; //p為parent,l為左孩子,r為右孩子
}htnode,*htnp;//動態分配數組存儲哈夫曼樹
/*****Huffman編碼表結構定義*****/
typedef struct huffman_code
{
unsigned char len;//長度
unsigned char *codestr;
}hufcode;
typedef char **huffmancode;//動態分配數組存儲哈夫曼編碼表
2、本程序的構成,共有14個函數,一個菜單函數
int initial_files(char *source_filename,FILE **inp,char *obj_filename,FILE **outp);
//1.初始化文件名
char *create_filename(char *source_filename,char* obj_filename);
//2.創建文件名
int compress(char *source_filename,char *obj_filename);
//3.壓縮文件

代碼片段和文件信息
#include??//主要包括常用的輸入/輸出函數
#include??//主要包括常用的字符串操作函數
#include??//字符串轉換函數、內存分配函數、過程控制函數
//以下兩個庫函數可使用之一,完成庫函數的調用
#include?//作用是將鍵盤輸入的在屏幕上?打印?出來等
//#include?//字符的輸入、輸出函數,字符操作函數、顏色設置函數
/*****Huffman結構定義**********/
typedef?struct?node?
{?
????long????w;//w為權值
????short???plr;?//p為parent,l為左孩子,r為右孩子
}htnode*htnp;//動態分配數組存儲哈夫曼樹
/*****Huffman編碼表結構定義*****/
typedef?struct?huffman_code?
{?
????unsigned?char?len;//長度
????unsigned?char??*codestr;?
}hufcode;
typedef?char?**huffmancode;//動態分配數組存儲哈夫曼編碼表
/*********函數聲明*********/
int?initial_files(char?*source_filenameFILE?**inpchar?*obj_filenameFILE?**outp);
//1.初始化文件名
char?*create_filename(char?*source_filenamechar*?obj_filename);
//2.創建文件名
int?compress(char?*source_filenamechar?*obj_filename);
//3.壓縮文件
long?frequency_data(FILE?*inlong?fre[]);
//4.頻率數據
int?search_set(htnp?htint?nint?*s1?int?*s2);
//5.選取結點權值最小的樹
int?create_hftree(long?w[]int?nhtnode?ht[]);
//6.創建哈夫曼樹
int?encode_hftree(htnp?htpint?nhufcode?hc[]);
//7.編碼哈夫曼樹
unsigned?char?chars_to_bits(const?unsigned?char?chars[8]);
//8.把字符串用二進制數字表示:運用位運算的知識
int?write_compress_file(FILE?*inFILE?*outhtnp?hthufcode?hc[]char*?source_filenamelong?source_filesize);
//9.寫入壓縮文件
int?decompress(char?*source_filenamechar?*obj_filename);
//10.解壓縮
void?get_mini_huffmantree(FILE*?inshort?mini_ht[][2]);
//11.解壓構造微哈夫曼樹
int?write_decompress_file(FILE?*inFILE*?outshort?mini_ht[][2]long?bits_poslong?obj_filesize);
//12.寫入解壓縮
int?d_initial_files(char?*source_filenameFILE?**inpchar?*obj_filenameFILE?**outp);
//13.重新變成原始文件
/*菜單函數*/
void?main()
{
int?s;
char?filename[10];
//system(“color?3F“);//設置背景顏色?1.深藍色?2.墨綠色?3.天藍色4.棕紅色?5.紫色6.褐色7.灰色
????printf(“????????****************************************************\n“);
printf(“????????????????????*???????????菜單:????????????*\n“);
printf(“????????????????????*???1.------壓縮--------??????*\n“);
printf(“????????????????????*???2.------解壓縮------??????*\n“);
printf(“????????????????????*???0.------退出--------??????*\n“);
printf(“????????****************************************************\n“);
scanf(“%d“&s);
while(s!=0)
{
getchar();
switch(s)
{
case?1:
puts(“請輸入待壓縮文件路徑:“);
gets(filename);
compress(filenameNULL);
break;
case?2:
puts(“請輸入待解壓文件路徑:“);
gets(filename);
decompress(filenameNULL);
break;
default?:?
printf(“指令錯誤!請重新輸入指令:\n“);
}
puts(“?“);
printf(“????????****************************************************\n“);
printf(“????????????????????*???????????菜單:??????????????*\n“);
printf(“????????????????????*???1.------壓縮--------?????????*\n“);
printf(“????????????????????*???2.------解壓縮------????????*\n“);
printf(“????????????????????*???0.------退出--------??????????*\n“);
printf(“????????****************************************************\n“);
scanf(“%d“&s);
}
}
?????????????????
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????496042??2016-04-03?23:56??34.doc
?????文件???????16418??2013-12-20?12:46??huffman34.cpp
- 上一篇:vc++ 彩色圖與灰度圖的轉換
- 下一篇:DEC6713 GPIO例程
評論
共有 條評論