#include#include#include
#include
#define maxnum 60typedef
struct
huffnode;
typedef
struct
huffcode;
huffnode ht[maxnum*2]; //
存放哈夫曼樹
huffcode hcd[maxnum];
//存放ht陣列中對應的字元的編碼
int n; //
字元的個數
//初始化哈夫曼樹ht
void
initht()
ht[i].left=ht[i].right=ht[i].parent=-1
;
while((ch=fgetc(fp))!=eof)
else
if((ch>='
a' && ch<='
z')||(ch>='
a' && ch<='z'
)) ht[i].ch=ch;
else
if(ch>='
0'&&ch<='9'
) ht[i].weight=ht[i].weight*10+ch-'0'
; }
n=i+1
;
if(fclose(fp))}//
構造哈夫曼樹,看成有n棵樹,選擇權值最小的兩棵樹合併
void
createhufftree()
else
if(f==1
)else
minj=i;
f++;
}else
else
if(ht[i].weightminj=i;}}
i++;
}//合併兩個結點
ht[k].ch='#'
; ht[k].left=mini;
ht[k].right=minj;
ht[k].weight=ht[mini].weight+ht[minj].weight;
ht[k].parent=-1
; ht[mini].parent=ht[minj].parent=k;
}}//
將乙個字串反轉
void reverse(char *str)}//
哈夫曼編碼,通過父節點從下往上找
void
createhuffcode()
else
hcd[i].code[length++]=1+'0'
; j=ht[j].parent;
}hcd[i].start=hcd[i].code[length-1]-'0'
; hcd[i].code[length]='\0'
; reverse(hcd[i].code);
}//把hcd字元編碼寫入檔案document/code.txt中
if((fp=fopen("
document/code.txt
","w
"))==null)
for(i=0;i)
if(fclose(fp))}//
哈夫曼解碼,每次都從根節點開始搜尋
int releasehuffcode(char *str,char*code)
i++;
}str[length]='\0'
;
if(root==2*n-2
)
return1;
return0;
}//使用者輸入編碼字元
void
encode()
; printf(
"\n請輸入要編碼的字串(length<50)\n");
scanf("%s
",str);
while
(str[i])
i++;
}else
}if(f)
puts(code);
else
printf(
"你輸入的字串錯誤!\n");
printf(
"按任意鍵後重新選擇!\n");
getch();}//
使用者輸入解碼字串
void
decode()
//主函式
void
main()
}}
哈夫曼編碼解碼
簡單實現編碼解碼功能 列印哈夫曼樹形 該怎麼做呢 求教!實現初始化,建立huffman樹,並完成字元的編碼 之前解碼用for迴圈不能夠重新復位遍歷 while更好用 include stdio.h include string.h define n 10 待編碼字元的個數,即樹中葉結點的最大個數 d...
哈夫曼(Huffman)編碼與解碼
利用哈夫曼編碼進行資訊通訊可以大大提高通道利用率,縮短資訊傳輸時間,降低傳輸成本。但是,這要求在傳送端通過乙個編碼系統對待傳輸資料預先編碼,在接收端將傳來的資料進行解碼。對於雙工通道,每端都需要乙個完整的編碼 解碼系統。試為這樣的資訊收發站寫乙個哈夫曼的編 解碼系統。乙個完整的系統具有以下幾種操作 ...
哈夫曼編碼和解碼
試題描述 輸入為 一段英文或中文的文章 原文 對輸入的文章構造哈夫曼樹,生成對應的編碼,輸出為 原文所對應的編碼 譯文 根據已經生成的編碼表,輸入任意的譯文可以得到對應的原文。要求有執行結果截圖。include using namespace std typedef struct point huf...