Huffman編碼 資料結構

2021-03-31 08:56:59 字數 4269 閱讀 9610

#include #include #include class data 

};typedef class huffman

} * huffmantree;

typedef char ** huffmancode;

// 在陣列中選擇兩個小的權的資料

void select(int *tw, int n, int &s1, int &s2)

temp_w = tw[i];

s1 = i;

// 第一遍先確定s1

for(; i<=n; i++)

// ifin

}// if

}//for

i = 1;

while(!tw[i] || i == s1)

temp_w = tw[i];

s2 = i;

for(; i<=n; i++)

// ifin

loop:;

}// if

}// for

// 使權小的放到s1

if(tw[s1]>tw[s2])

// if

// 取得兩個小的位置後,將備用temp_array_w位置上的權抹去,表示已經被訪問

tw[s1] = tw[s2] = null;

tw[0] = tw[0]-2;

}void initialization (huffmantree &ht, huffmancode &hc, int n)

// for

// 建立標誌s1和s2

int s1, s2;

s1 = s2 = null;

// 建立huffman樹

for(i = n + 1; i<=2*n - 1; i++)

// for

cout << "/tdata/tweight/tparent/tlchild/trchild" << endl;

for(i = 1; i<=2*n - 1; i++)

cout << "/t" << ht[i].data.ch << "/t" << ht[i].weight << "/t" << ht[i].parent << "/t" << ht[i].lchild << "/t" << ht[i].rchild << endl;

// 建立好了樹後列印輸出到檔案humtree中

ofstream humtreeout("humtree.dll");

// 把個數記錄到檔案開始

humtreeout << ht[0].weight << endl;

for(i = 1; i<=2*n -1; i++)

humtreeout.close();

}// void

// 通過樹給字元編碼,並且把編碼輸入到codefile中

void encoding (huffmancode &hc, huffmantree &ht, int n, ifstream &tobetranfile)

delete cd;

char temp_file_ch;

ofstream codeout("codefile.txt", ios::ate); // ios::ate表示乙個open模式,是在檔案後面續寫

while(!tobetranfile.eof()) // 一旦檔案到了末尾,eof()函式會返回乙個非零值 }

codeout.close();

}void decoding (huffmantree &ht, ifstream &codefile, int n)

else

}

else

if(!ht[temp_num].lchild)

else

}

} textout.close();

cout << "已經翻譯到text.txt檔案中" << endl;

}// 通過已存在的humtree.dll建立新的樹

bool creatnewhum(huffmantree &ht, int &n)

// huffmantree ht_temp = ht;

// huffmantreein.getline(temp_line, 9);

huffmantreein >> temp_n; // 乙個單詞為單位輸入

huffmantreein.get(temp_ch);

// huffmantreein.seekg(1);

ht = new huffman[2*temp_n];

// delete ht_temp;

// 通過讀入檔案中的資料給ht賦值

/*

for(;i<20;i++)

//*/

//*

int j = 1;

while(!huffmantreein.eof())

if(i%5 == 2)

if(i%5 == 3)

if(i%5 == 4)

if(i%5 == 0)

// i自加到5的倍數後j++

if(i%5 == 1)

j++;

// 防止輸入最後乙個定位符號

if(i > (2*temp_n -1)*5)

break;

}// while

//*/

// 從指定檔案裡讀入樹型

huffmantreein.close();

n = temp_n;

return true;

}void printcode ()

filein.close();

fileout.close();

}void treeprint ()

void titalprint()

// 把幾個運算的函式全都放到乙個裡面去,主函式main就只呼叫下運算函式

void ***putehuffman ()

// switch

//*/

cout << "translating in (f)ile or (p)ressing: ";

cin >> temp_choise;

switch(temp_choise)

}

hc = new char*[n+1];

ifstream tobetranfile("tobetran.txt");

encoding(hc, ht, n, tobetranfile);

tobetranfile.close();

for(int i = 1; i<=n; i++)

cout << ht[i].data.ch << "<-->" << hc[i] << endl;

}

// 利用建立好的huffman樹(如果不在記憶體則從檔案humtree中讀入),對檔案

// tobetran中的正文進行編碼,然後將結果寸入codefile.txt檔案中.

break;

case 'd':

break;

case 'm':

// 什麼都不做

break;

default:

cout << "please pess f or m..." << endl;

continue;

}// switch

ifstream codefile("codefile.txt");

decoding(ht, codefile, n);

codefile.close();

}

// 利用建立好的haffman樹將檔案codefile中的**進行翻譯.結果寸入檔案textfile.txt中

break;

case 'p':

printcode();

// 列印**,50個每行,並且將此字元形式的編碼檔案寫入codeprin中

break;

case 't':

// 印huffman樹,將已經在記憶體的huffman樹以直觀的方式顯示,同時將此字元形式的huffman樹寫

// 入檔案treeprint中

break;

case 'q':

return;

default:

cout << "please inputing in /" i e d q /"..." << endl;

continue;

}// switch

// 回到主選單

titalprint();

}// while

}// ***puterhuffman

void main()

哈夫曼編碼 資料結構

上週日做了資料結構實驗報告,感覺還行。一 課題描述 二 概要設計 主要思想應根據 執行順序了解 1 資料邏輯結構 主要是樹形結構,也有使用線性結構作為輔助 儲存結構分析 主要是非線性結構 二叉樹 結點 struct hufftree 2 本程式包含8個函式 1 將資料樹化函式hufftree cre...

WPF Silverlight程式編碼資料收集

一.獲取路徑資訊 序路徑的,應該這樣用 mycollection system curdirectory system.io.path.getdirectoryname process.getcurrentprocess mainmodule.filename 二 獲取silverlight.web...

哈夫曼編碼 資料結構 源程式

構造思想 哈夫曼樹 1 由給定的n個權值構造n棵樹只有乙個葉子結點的二叉樹,得到乙個二叉樹的合f 2 再f中選取根結點的權值最小和次小的二棵二叉樹作為左,右子樹構造一棵新的二叉樹,這棵樹的根結點的權值為左右子樹根結點權值之和。3 在集合f中刪除作為左右子樹的二棵二叉樹,並將新建的二叉樹加入到集合f中...