資源簡(jiǎn)介
這是大二時(shí)的數(shù)據(jù)結(jié)構(gòu)的課設(shè),今天與大家分享。可以讀寫(xiě)文件,編碼譯碼,以及對(duì)輸入的異常處理。

代碼片段和文件信息
#include?
#include?
#include?
/*-------------------------------------------------------------------------------------------------------------------*/
struct?HtNode???????????????????????????/*哈夫曼樹(shù)結(jié)點(diǎn)的結(jié)構(gòu)*/
{
int?ww; /*權(quán)值*/
int?parentllinkrlinkrlparent; /*rlparent是記錄該結(jié)點(diǎn)是父結(jié)點(diǎn)的左孩子還是右孩子*/
char?a; ????????????????????????????/*記錄編碼字符的信息*/
};
typedef?struct?HtNode?*?PHtNode;
struct?HtTree /*哈夫曼樹(shù)結(jié)構(gòu)*/
{
int?m; /*外部結(jié)點(diǎn)的個(gè)數(shù)*/
int?root; /*哈夫曼樹(shù)在數(shù)組中的下標(biāo)*/
struct?HtNode?*ht; /*存放2*m-1個(gè)結(jié)點(diǎn)的數(shù)組*/
};
typedef?struct?HtTree?*?PHtTree; /*哈夫曼樹(shù)類(lèi)型的指針類(lèi)型*/
/*-------------------------------------------------------------------------------------------------------------------*/
/************************************************************************/
/*函數(shù)的功能:創(chuàng)建哈夫曼樹(shù),將電文編碼??????????????????????????????????*/
/*函數(shù)的參數(shù):1、哈夫曼樹(shù)葉子結(jié)點(diǎn)的個(gè)數(shù)??2、權(quán)值的數(shù)組?3、編碼字符的信息*/
/*函數(shù)的返回值:返回指向數(shù)組的指針??????????????????????????????????????*/
/************************************************************************/
PHtTree?huffman(int?mint?*wchar?*p)??????????????/*構(gòu)造具有m個(gè)外部結(jié)點(diǎn)的哈夫曼樹(shù)*/
{
PHtTree?pht;
int?ijx1x2m1m2;
pht=(PHtTree)malloc(sizeof(struct?HtTree)); ???/*分配哈夫曼樹(shù)空間*/
if(pht==NULL)
{
printf(“Out?of?space!!\n“);
return?pht;
}
pht->ht=(struct?HtNode?*)malloc(sizeof(struct?HtNode)*(2*m-1));?/*分配ht數(shù)組空間*/
if(pht->ht==NULL)
{
printf(“Out?of?space!!\n“);
return?pht;
}
for(i=0;i<2*m-1;i++) /*置ht數(shù)組初態(tài)*/
{
pht->ht[i].llink=-1;
pht->ht[i].rlink=-1;
pht->ht[i].parent=-1;
pht->ht[i].rlparent=-1;
if(i {
pht->ht[i].ww=w[i];??????/*各點(diǎn)的權(quán)值*/
pht->ht[i].a=p[i];???????/*各點(diǎn)的字符信息*/
}
else
pht->ht[i].ww=-1;????????/*剩余的結(jié)點(diǎn)賦值為-1*/
}
for(i=0;i {
m1=m2=32767; /*相關(guān)變量賦初值*/
x1=x2=-1;
for(j=0;j {
if(pht->ht[j].wwht[j].parent==-1) /*x1中存放最小權(quán)的無(wú)父結(jié)點(diǎn)的結(jié)點(diǎn)下標(biāo)*/
{
m2=m1; /*x2中存放第二小權(quán)的無(wú)父結(jié)點(diǎn)的結(jié)點(diǎn)下標(biāo)*/
x2=x1;
m1=pht->ht[j].ww;
x1=j;
}
else?if(pht->ht[j].wwht[j].parent==-1)
{
m2=pht->ht[j].ww;
x2=j;
}
}
pht->ht[x1].parent=m+i; /*構(gòu)造內(nèi)部結(jié)點(diǎn)*/
pht->ht[x1].rlparent=0;?????????????????/*該結(jié)點(diǎn)是父結(jié)點(diǎn)的左孩子*/
pht->ht[x2].parent=m+i;?????????????????/*該結(jié)點(diǎn)的父結(jié)點(diǎn)的位置,即數(shù)組下標(biāo)*/
pht->ht[x2].rlparent=1; /*該結(jié)點(diǎn)是父結(jié)點(diǎn)的右孩子*/
pht->ht[m+i].ww=m1+m2; /*父結(jié)點(diǎn)的權(quán)值是左右孩子的權(quán)值之和*/
pht->ht[m+i].llink=x1; /*將父結(jié)點(diǎn)的llink的值賦上左孩子所在的數(shù)組下標(biāo)*/
pht->ht[m+i].rlink=x2; /*將父結(jié)點(diǎn)的rlink的值賦上右孩子所在的數(shù)組下標(biāo)*/
}
pht->root=2*m-2;????????????????????????????/*根結(jié)點(diǎn)的位置在數(shù)組的最后一個(gè)元素*/
printf(“哈夫曼樹(shù)創(chuàng)建成功!!\n哈夫曼樹(shù)在數(shù)組中的存儲(chǔ)形式為:\n“);????????????????????????????????
for(i=0;i<2*m-1;i++)???????????????????????/*輸出哈夫曼樹(shù)中的數(shù)組所保存的權(quán)值*/
{
printf(“??%d?“pht->ht[i]);
}
printf(“\n編碼成功!\n“);
return?pht;????????????????????????????????????????????????????
}
/*--------------------------------------------
?屬性????????????大小?????日期????時(shí)間???名稱(chēng)
-----------?---------??----------?-----??----
?????文件?????634880??2010-07-26?18:47??哈夫曼樹(shù).doc
?????文件??????32837??2010-07-14?12:16??哈夫曼樹(shù)\Debug\huffamn.obj
?????文件?????184772??2010-07-13?12:59??哈夫曼樹(shù)\Debug\huffamn.pch
?????文件?????492544??2010-07-13?22:20??哈夫曼樹(shù)\Debug\huffamn.pdb
?????文件???????2560??2010-07-13?13:10??哈夫曼樹(shù)\Debug\huffamn.suo
?????文件??????33792??2010-07-14?12:16??哈夫曼樹(shù)\Debug\vc60.idb
?????文件??????53248??2010-07-14?12:16??哈夫曼樹(shù)\Debug\vc60.pdb
?????文件?????204869??2010-07-14?12:16??哈夫曼樹(shù)\Debug\哈夫曼樹(shù).exe
?????文件?????225368??2010-07-14?12:16??哈夫曼樹(shù)\Debug\哈夫曼樹(shù).ilk
?????文件?????184772??2010-07-13?12:39??哈夫曼樹(shù)\Debug\哈夫曼樹(shù).pch
?????文件?????549888??2010-07-14?12:16??哈夫曼樹(shù)\Debug\哈夫曼樹(shù).pdb
?????文件???????3072??2010-07-14?08:00??哈夫曼樹(shù)\Debug\哈夫曼樹(shù).suo
?????文件?????????27??2010-07-13?22:06??哈夫曼樹(shù)\dianwen.txt
?????文件??????20444??2010-07-14?08:12??哈夫曼樹(shù)\huffamn.c
?????文件???????3411??2010-07-14?08:06??哈夫曼樹(shù)\huffamn.dsp
?????文件??????50176??2010-07-14?08:10??哈夫曼樹(shù)\huffamn.ncb
?????文件??????48640??2010-07-14?08:06??哈夫曼樹(shù)\huffamn.opt
?????文件??????????0??2010-07-14?08:10??哈夫曼樹(shù)\huffamn.plg
?????文件???????4305??2010-07-11?17:01??哈夫曼樹(shù)\哈夫曼樹(shù).dsp
?????文件????????524??2010-07-11?16:12??哈夫曼樹(shù)\哈夫曼樹(shù).dsw
?????文件??????50176??2010-07-14?13:43??哈夫曼樹(shù)\哈夫曼樹(shù).ncb
?????文件??????48640??2010-07-14?13:43??哈夫曼樹(shù)\哈夫曼樹(shù).opt
?????文件????????898??2010-07-14?12:16??哈夫曼樹(shù)\哈夫曼樹(shù).plg
????..A..H.??????6144??2010-07-11?20:16??哈夫曼樹(shù)\哈夫曼樹(shù).suo
?????目錄??????????0??2010-07-14?08:11??哈夫曼樹(shù)\Debug
?????目錄??????????0??2010-07-14?13:43??哈夫曼樹(shù)
-----------?---------??----------?-----??----
??????????????2835987????????????????????26
評(píng)論
共有 條評(píng)論