資源簡介
絕對是完整的可以運行的程序!首先輸入隨便一段字符,根據字符的多少確定權值,最后編碼譯碼。形象輸出二叉樹!
代碼片段和文件信息
#include
#?include
#?include
#?define?maxsize?100
#?define?max?100
typedef?struct?
{
char?data;
int?weight;
int?parent;
int?left;
int?right;
}huffnode;?????//記錄哈夫曼樹結點的數據類型
typedef?struct
{
char?cd[max];
int?start;???
}huffcode;??//記錄哈夫曼編碼的數據類型
void?dq(huffnode?*?ht)??//初期化,讀取字符串
{
char?st[100];
FILE?*fz;
char?j;
int?i=0nmcount=0x;
printf(“1.手動輸入字符串??2.讀取字符串文件?0.退出\n“);
scanf(“%d“&x);
getchar();
switch(x)
{
case?1:
printf(“輸入字符串:“);
???????? st[i]=getchar();
???????? while(st[i]!=‘\n‘)
{
???? ???i++;
???????count++;
??????st[i]=getchar();
}
break;
case?2:
fz=fopen(“hfmtree.txt““r“);
if(fz==NULL)
{?
printf(“沒有字符串文件。\n“);
return;
}
else
{
j=fgetc(fz);
while(j!=EOF)
{
count++;
st[i]=j;
i++;
j=fgetc(fz);
}
fclose(fz);
}
break;
case?0:
break;
default:
printf(“輸入錯誤。\n“);
}
for(i=0m=1;i {
for(n=1;n<=m;n++)??//判斷,頻度表里面是有有當前字符
if(st[i]==ht[n].data)?//若有,對應的頻度加1
{
ht[n].weight++;
break;
}
if(n>m)??//若沒有,新增頻度表,并初始化
{
ht[m].data=st[i];
ht[m].weight=1;
m++;
}
}
ht[0].data=‘#‘;??//賦上特殊符號,用于判斷是否空結點
ht[0].weight=m-1;???//記錄葉子數
printf(“字符頻度表:\n“);?//輸出頻度表
for(i=1;i<=ht[0].weight;i++){
printf(“%c:“ht[i].data);
printf(“%d\n“ht[i].weight);
}
}
void?input(char?*?zf)???//讀取需要編碼的文件,用數組記錄文件內容
{
FILE?*?in;
char?j;
int?i;
in=fopen(“tobetrans.dat““r“);
if(in==NULL)
{
printf(“沒有可編譯的文件。\n“);
zf[0]=-1;
return;
}
else
{
for(i=0;i<=100;i++)
{
j=fgetc(in);??//讀取字符
if(j==EOF)
{
zf[i]=‘\0‘;
return;
}
else
{
zf[i]=j;?//記錄字符
}
}
}
fclose(in);
}
void?select(huffnode?*?htint?iint?*s1int?*s2)?
//找出權值最小的樹,s1記錄最小值下標,s2記錄次最小指下標
{
int?x;
int?m1m2;
m1=m2=1000;
for(x=1;x<=i;x++)
if(ht[x].parent==0)??//對沒有父親結點的結點,進行對比
if(ht[x].weight {
m2=m1;???????//最小值變成次最小值
????????????m1=ht[x].weight;?//當前結點權值成為最小值
*s2=*s1;????//最小值下標成為次最小值下標
*s1=x; //當前結點下標成為最小值小標
}
else
if(ht[x].weight {
m2=ht[x].weight;?//當前結點的權值成為次最小值
*s2=x;???//該下標成為次最小值下標
}
}
void?hfmtree(huffnode?*?ht)????//生成哈夫曼樹
{?
int?ix1=0x2=0n;
n=ht[0].weight;
for(i=1;i<=2*n-1;i++)
ht[i].parent=ht[i].left=ht[i].right=0;??//初始化
for(i=n+1;i<=2*n-1;i++)
{
????????select(hti-1&x1&x2);
ht[x1].parent=i;
ht[x2].parent=i;
ht[i].weight=ht[x1].weight+ht[x2].weight;?//合并
ht[i].left=x1;??
ht[i].right=x2;
}
}
void?hcc(huffnode?*?htt)????//存儲哈夫曼樹于文件hfmtree.bin
{
FILE?*?fht;
int?i=0;
fht=fopen(“hfmtree.bin““wb“);
if(fht==NULL)?printf(“建立文件hfmtree.bin失敗。\n“);
else
{
fwrite(&htt[i]sizeof(huffnode)2*htt[0].weightfht);
fclose(fht);
}
}
void?dhf(huffnode?*?
- 上一篇:基于MFCVC6.0的簡單計算器程序
- 下一篇:C語言動畫設計衛星環繞地球初學者
評論
共有 條評論