int main() { int i,n; int *w; HuffmanTree HT; HuffmanCode HC; // printf("Node Number:"); scanf("%d",&n); //权值个数 w=(int *)malloc(n*sizeof(int)); // printf("Input weights:"); for ( i=0;i<n;i++) //录入权值 scanf("%d",&w[i]); HC=(char **)malloc((n+1)*sizeof(char*)); //0空间未用 HT=(HuffmanTree)malloc((2*n+1+1)*sizeof(HTNode));//0空间未用 HuffmanCoding(HT, HC, w, n); // printf("\n"); for (i = 1; i<n+1; i++){ puts(HC[i]); //输出哈夫曼编码 free(HC[i]); //释放空间 } free(HC); free(HT); return 0; }//main
void Init() { FILE *fp; int i; printf("请输入字符个数:\n"); scanf("%d",&n); while(n<2){ printf("输入的数据有误,请重新输入:\n"); scanf("%d",&n); } ch=(char *)malloc(n*sizeof(char)); printf("请输入所有字符:\n"); getchar(); for(i=0;i<n;++i) scanf("%c",&ch[i]); w=(int *)malloc(n*sizeof(int)); printf("请输入这些字符的权值:\n"); for(i=0;i<n;++i) scanf("%d",&w[i]); HuffmanCoding(HT,HC,w,n,ch); /*printf("编码结果如下:\n"); for(i=1;i<=n;++i) printf("%c:%s\n",HT[i].ch,HC[i]);*///调试 fp=fopen("hfmTree.txt","w"); fprintf(fp,"%d",n); for(i=0;i<n;++i) fprintf(fp,"%c",ch[i]); for(i=0;i<n;++i) fprintf(fp,"%5d",w[i]); for(i=1;i<=n;++i) fprintf(fp,"\n%c:%s",HT[i].ch,HC[i]); fclose(fp); printf("初始化成功\n"); }
int main() { int n; //需要编码的字符的个数 printf("请输入需要编码的字符的个数(>1):"); scanf("%d",&n); while(n<=1) { printf("字符个数必须大于1,请重新输入:"); scanf("%d",&n); } int i; int *wet = (int *)malloc(n*sizeof(int)); //存放每个字符的权值 printf("请依次输入这%d个字符的权值(整型):",n); for(i=0;i<n;i++) { scanf("%d",wet+i); } HuffmanCode HC; //保存赫夫曼编码 HuffmanTree HT = create_HuffmanTree(wet,n); //生成赫夫曼树 HuffmanCoding(HT,HC,n); //第一种方法求每个字符的赫夫曼编码 // HuffmanCoding2(HT,HC,n); //第二种方法求每个字符的赫夫曼编码 for(i=0;i<n;i++) { puts(HC[i]); } free(wet); return 0; }
void HuffmanTreeTest() { int i,n=4,m; char test[]="DBDBDABDCDADBDADBDADACDBDBD"; char code[100],code1[100]; char alphabet[]={'A','B','C','D'}; int w[]={5,7,2,13} ; HuffmanTree *ht; HuffmanCode *hc; m=2*n-1; ht=(HuffmanTree *)malloc((m+1)*sizeof(HuffmanTree)); if(!ht) { printf("内存分配失败!\n"); exit(0); } hc=(HuffmanCode *)malloc(n*sizeof(char*)); if(!hc) { printf("内存分配失败!\n"); exit(0); } CreateTree(ht,n,w); HuffmanCoding(ht,n,hc); for(i=1;i<=n;i++) printf("字母:%c,权重:%d,编码为 %s\n",alphabet[i-1],ht[i].weight,hc[i-1]); Encode(hc,alphabet,test,code); printf("\n字符串:\n%s\n转换后为:\n%s\n",test,code); Decode(ht,n,code,alphabet,code1); printf("\n编码:\n%s\n转换后为:\n%s\n",code,code1); }
int main() { int i,m,n,w[N+1]; HTNode ht[N+1]; HTCode hc[N+1]; Init(hc,&n); HuffmanCoding(ht,hc,n); for(i=1;i<=n;i++) printf("\n%c --- %s",hc[i].data,hc[i].code); return 0; }
int main(int argc,char *argv[]) { int i; char buf[CHAR_MAX_SIZE]; int weight[CHAR_MAX_SIZE]; HuffmanTree HT; HuffmanCode HC; n=0; printf("����������ַ�:"); scanf("%s%*c",buf); n=strlen(buf); printf("�����ӦȨֵ:"); for(i=0;i<n;i++) scanf("%d%*c",&weight[i]); HuffmanCoding(HT,HC,weight,buf,n); while(1) { char c; char code[CODE_MAX_SIZE]; printf("1.�����ַ�����ת��" "\n2.���������з���" "\n3.�˳�����\n"); scanf("%d%*c",&i); switch(i) { case 1: printf("�����ַ�:"); scanf("%c%*c",&c); GenerateCoding(HT,code,c,n); printf("\nת��Ϊ:%s\n",code); break; case 2: printf("�������:"); scanf("%s%*c",code); TransCoding(HT,code,c,n); printf("\n����Ϊ:%c\n",c); break; case 3: goto loop1; default: break; } } loop1: return 0; }
void main() { HuffmanTree HT; HuffmanCode HC; int *w,n,i; printf("请输入权值的个数(>1):"); scanf("%d",&n); w=(int*)malloc(n*sizeof(int)); printf("请依次输入%d个权值(整型):\n",n); for(i=0;i<=n-1;i++) scanf("%d",w+i); HuffmanCoding(&HT,&HC,w,n); for(i=1;i<=n;i++) puts(HC[i]); }
int huffman() { HuffmanTree huffmanTree; HuffmanCode huffmanCode; int *w, n, i; printf("请输入权值的个数(>1):"); scanf("%d", &n); w = (int *) malloc(n * sizeof(int)); printf("请依次输入%d个权值(整型):\n", n); for (i = 0; i <= n - 1; i++) scanf("%d", w + i); HuffmanCoding(&huffmanTree, &huffmanCode, w, n); for (i = 1; i <= n; i++) puts(huffmanCode[i]); return 0; }
void main() { HuffmanTree HT; HuffmanCode HC; int *w, n, i; printf("请输入权值得个数(n > 1):"); scanf("%d",&n); w = (int *)malloc(n * sizeof(int)); printf("请依次输入%d个权值(整型):\n",n); for (i = 0; i <= n - 1; ++i) { scanf("%d", w + i); } HuffmanCoding(HT,HC,w,n); for (i = 1; i <= n; ++i) { puts(HC[i]); } }
int main() { int i,n,m; int *w; HuffmanTree HT; HuffmanCode HC; scanf("%d",&n); //权值个数 w=(int *)malloc(n*sizeof(int)); for( i=0;i<n;i++) //录入权值 scanf("%d",&w[i]); m = 2*n-1; // for (i=0;i<n;i++) //录入权值 // printf("%d",w[i]); HC=(HuffmanCode)malloc((n+1)*sizeof(char*)); //0空间未用 HT=(HuffmanTree)malloc((2*n+1+1)*sizeof(HTNode));//0空间未用 for (i=1; i<=n; i++) { //初始化 HT[i].weight=w[i-1]; HT[i].parent=0; HT[i].lchild=0; HT[i].rchild=0; } for (i=n+1;i<=m; i++) { //初始化 HT[i].weight=0; HT[i].parent=0; HT[i].lchild=0; HT[i].rchild=0; } HuffmanCoding(HT,HC,w,n); for (i = 1; i<n+1; i++) { puts(HC[i]); //输出哈夫曼编码 free(HC[i]); //释放空间 } free(HC); free(HT); return 0; }//main
void Decoding() { FILE *fp,*fp1; int i,m; char in; if(n==0) { fp=fopen("hfmTree.txt","r"); fscanf(fp,"%d",&n); if(feof(fp)){ printf("请先初始化哈夫曼树!\n"); } ch=(char *)malloc(n*sizeof(char)); for(i=0;i<n;++i) fscanf(fp,"%c",&ch[i]); w=(int *)malloc(n*sizeof(int)); for(i=0;i<n;++i) fscanf(fp,"%d",&w[i]); HuffmanCoding(HT,HC,w,n,ch); printf("已载入哈夫曼树!\n"); fclose(fp); } fp=fopen("CodeFile.txt","r"); fp1=fopen("TextFile.txt","w"); for(i=1;HT[i].parent!=0;++i); m=i; while(!feof(fp)){ if(HT[m].lchild && HT[m].rchild){ fscanf(fp,"%c",&in); if(in=='0') m=HT[m].lchild; else m=HT[m].rchild; } else{ fprintf(fp1,"%c",HT[m].ch); m=i; } } printf("\n译码结束,译码结果已保存到TextFile.txt文件中!\n"); fclose(fp); fclose(fp1); }
void Encoding() { FILE *fp,*fp1; int i; char in; if(n==0) { fp=fopen("hfmTree.txt","r"); fscanf(fp,"%d",&n); if(feof(fp)){ printf("请先初始化哈夫曼树!\n"); } ch=(char *)malloc(n*sizeof(char)); for(i=0;i<n;++i) fscanf(fp,"%c",&ch[i]); w=(int *)malloc(n*sizeof(int)); for(i=0;i<n;++i) fscanf(fp,"%d",&w[i]); HuffmanCoding(HT,HC,w,n,ch); printf("已载入哈夫曼树!\n"); fclose(fp); } fp=fopen("ToBeTran.txt","r"); printf("成功读取ToBeTran.txt\n"); fp1=fopen("CodeFile.txt","w"); fscanf(fp,"%c",&in); while(!feof(fp)) { for(i=1;i<=n;++i){ if(HT[i].ch==in) break; } fprintf(fp1,"%s",HC[i]); fscanf(fp,"%c",&in); } printf("\n编码结束,结果已存入CodeFile.txt文件中!\n"); fclose(fp); fclose(fp1); }