上週日做了資料結構實驗報告,感覺還行。
一、課題描述
二、概要設計(主要思想應根據**執行順序了解)
1)資料邏輯結構:主要是樹形結構,也有使用線性結構作為輔助;
儲存結構分析:主要是非線性結構(二叉樹)。
結點:struct hufftree;
2)本程式包含8個函式:
(1)將資料樹化函式hufftree* create(const char c, int i)
c為字元,i為權值,將其存入一棵最小的二叉樹中,左右兒子均為空,然後返回這棵二叉樹,配合init()函式使用。
(2)初始化函式void init():
接受輸入的字元及其權值,並將每一組字元和權值樹化,存入vector容器huff中。
(3)比較函式bool cmp(hufftree*h1,hufftree*h2)
比較兩個結點,如果前者權值小於後者,返回true,否則返回false,輔助sort函式使用。
(4)合併兩棵樹函式hufftree* merge(hufftree*t1, hufftree*t2)
建立乙個新結點,權值為t1和t2的權值之和,char資料為』#』,表示非輸入的字元,然後返回這個結點(樹)。
(5)(主要演算法實現)編碼函式hufftree* encode()
在容器huff裡面,只要不止一棵樹,就進行排序,將權值小的排在前面,按規則合併最小的兩棵樹(刪除原兩樹,將新樹插入),當還剩下一棵樹的時候,這棵樹就是哈夫曼樹,然後把這棵樹返回,用finaltree接收。
(6)得到編碼函式void huffvisit(hufftree*t, string s)
遍歷finaltree,以左為1,右為0,每碰到data為字母的子樹,就把當前的01字元和字母串存入容器huffdic中(以字母為key)
(7)解碼函式void decode(hufftree*t, string s)
依s中01字串以1左0右的規則遍歷finaltree,得到的每乙個字母均存入string decstr中,得到解碼字串decstr。
(8)檔案操作函式void file()
將huffdic和decstr中儲存的結果寫入檔案中。
(9)展示函式void show()
將測試結果列印出來
(10)主函式int main()
呼叫其他函式,完成功能。
三、**編寫(注:本**在visual studio 2017下編譯執行通過)
#include#include#include#include#include#includeusing namespace std;
struct hufftree //樹結點結構體
;typedef pairpair; //為了方便起見,現將前者簡化寫法
bool space=false;
hufftree* finaltree; //最終的哈夫曼樹
vectorhuffdic; //存放每個字元的哈夫曼編碼
vectorhuff; //存放開始的全部哈夫曼樹
string decodestr; //對01字串解碼後的字串
hufftree* createtree(const char c, int i) //將資料化為小樹
void initial()
cout << "是否輸入空格' '的權值?如果是,請輸入正整數;如果否,請輸入負數:"; //確認是否為空格編碼
cin >> t;
if (t >= 0)
}bool sortcmp(hufftree*h1, hufftree*h2) //sort的比較函式過載
hufftree* treemerge(hufftree*t1, hufftree*t2) //和並兩棵小樹,使兩棵小樹成為大樹的孩子
hufftree* getfinaltree()
while (huff.size() > 1) //huff內不止一棵樹的時候
return huff.front(); //返回最後剩餘的一棵樹,即finaltree
}void encode(hufftree*t, string s)
if (t->right) //如果有右子樹 }
void decode(hufftree*t, string s)
else }
void fileaction()
for (int i = 0; i < huffdic.size(); i++)
f << decodestr; //將decodestr寫入檔案
f.close();
cout << "結果已儲存至——'test.txt'!" << endl;
}void results()
cout << "請輸入欲編碼的字串:";
//cin >> test;
char c[100] = ;
getchar();
cin.getline(c, 100); //getline以輸入帶空格的字串
string test(c, c + 100);
int sym = 0;
for (string::iterator it = test.begin(); it != test.end(); it++)
//else
//} if (sym)
cout << "字串中有未編碼字元,編碼結果可能錯誤";
cout << endl << "請輸入欲解碼的01編碼:"<> test;
decode(finaltree, test); //輸入編碼,進行解碼
cout << decodestr << endl;
}int main()
哈夫曼編碼 資料結構 源程式
構造思想 哈夫曼樹 1 由給定的n個權值構造n棵樹只有乙個葉子結點的二叉樹,得到乙個二叉樹的合f 2 再f中選取根結點的權值最小和次小的二棵二叉樹作為左,右子樹構造一棵新的二叉樹,這棵樹的根結點的權值為左右子樹根結點權值之和。3 在集合f中刪除作為左右子樹的二棵二叉樹,並將新建的二叉樹加入到集合f中...
資料結構 哈夫曼樹 哈夫曼編碼
哈夫曼樹又稱最優樹 二叉樹 是一類帶權路徑最短的樹。構造這種樹的演算法最早是由哈夫曼 huffman 1952年提出,這種樹在資訊檢索中很有用。結點之間的路徑長度 從乙個結點到另乙個結點之間的分支數目。樹的路徑長度 從樹的根到樹中每乙個結點的路徑長度之和。結點的帶權路徑長度 從該結點到樹根之間的路徑...
哈夫曼編碼 哈夫曼樹 (資料結構)
哈夫曼編碼,又稱霍夫曼編碼,是一種編碼方式,哈夫曼編碼是可變字長編碼 vlc 的一種。huffman於1952年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做huffman編碼 有時也稱為霍夫曼編碼 include include inc...