#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
int weight;
char ch;
int parent,lchild,rchild;
}HTNode,*HuffmanCode;
void welcome();
void HuffmanCoding(HuffmanTree&,char*,int*,int);
void select(HuffmanTree HT,int j,int *s1,int *s2);
void init();
void Coding();
void Decoding();
void Print_code();
void Print_tree();
void Read_tree(HuffmanTree&HT);
void find(HuffmanTree &HT,char*code,char*text,int i,int m);
void Convert(unsigned char T[100][100],int s,int *i,int m);
HuffmnTree HT;
int n=0;
int main()
{
char select;
while(1)
{
welcome();
scanf("%c",&select);
switch(select)
{
case 'i':
case 'I':
Init();break;
case 'c':
case 'C':
Coding();break;
case 'd':
case 'D':
Decoding();break;
case 'p':
case 'P':
Print_code();break;
case 't':
case 'T':
Print_tree();break;
case 'e':
case 'E':
exit(1);
default:
printf("Input Error!");
}
getchar();
}
return 0;
}
void welcome()
{
printf("----------------------------------\n");
printf(" what do you want to do? \n");
printf("----------------------------------\n");
printf("----------------------------------\n");
printf("-I----Init the Huffman Tree.------\n");
printf("-C----Code your file--------------\n");
printf("-D----Decode the code-------------\n");
printf("-P----Print the codefile----------\n");
printf("-T----Print the Huffman Tree------\n");
printf("----------------------------------\n");
}
void Init()
{
FILE *fp;
int i,n,w[52];
char character[52];
printf("\n输入字符个数n:");
scanf("%d",&n);
printf("输入%d个字符及其对应的权值:\n",n);
for(i=0;i<n;i++)
{
char b=getchar();
scanf("%c",&charater[i]);
scanf("%d",&w[i]);
}
HuffmanCoding(HT,charater,w,n);
if((fp=fopen("hfmtree.txt","w"))==NULL)
printf("Open file hfmtree.txt error!\n");
for(i=1;i<=2*n-1;i++)
{
if(fwrite(&HT[i],sizeof(HTNode),1,fp)!=1)
printf("File write error!\n");
}
printf("\n建立哈夫曼树成功,已将其存于文件fmtree.txt中\n");
fclose(fp);
}
void HuffmanCoding(HuffmanTree &HT,char *character,int *w,int n)
{
int m,i,s1,s2;
HuffmanTree p;
if(n<=1)
return;
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(p=HT+1,i=1;i<=n;++i,++p,++charater,++w)
{
p->ch=*charater;
p->weight=*w;
p->parent=0;
p->lchild=0;
p->rchild=0;
}
for(;i<=m;++i,++p)
{
p->ch=0;
p->weight=0;
p->parent=0;
p->lchild=0;
p->rchild=0;
}
for(i=n+1;i<=m;++i)
{
select(HT,i-1,&s1,&s2);
HT[s1].parent=i;
HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
}
void select(HuffmanTree HT,int j,int *s1,int *s2)
{
int i;
for(i=1;i<=j;i++)
if(HT[i].parent==0)
{
*s1=i;
break;
}
for(;i<=j;i++)
if((HT[i].parent==0)&&(HT[i].parent.weight<HT[*s1].weight))
*s1=i;
HT[*s1].parent=1;
for(i=1;i<=j;i++)
if(HT[i].parent==0)
{
*s2=i;
break;
}
for(;i<=j;i++)
if((HT[i].parent==0)&&(i!=*s1)&&(HT[i].weight<HT[*s2].weight))
*s2=i;
}
void Coding()
{
FILE *fp,*fw;
int i, f,c,start;
char *cd;
HuffmanCode HC;
if(n==0)
n=Read_tree(HT);
HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
cd=(char*)malloc(n*sizeof(char));
cd[n-1]='\0';
for(i=1;i<=n;++i)
{
start=n-1;
for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
if(HT[f].lchild==c)
cd[--start]='0';
else
cd[--start]='1';
HC[i]=(char*)malloc(n-start)
}
}
建立哈夫曼树
最新推荐文章于 2023-05-24 23:42:43 发布