当前位置:文档之家› 哈夫曼树源代码

哈夫曼树源代码

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <time.h>#include<windows.h> typedef struct{float weight;int flag;int parent;int lchild;int rchild;}huffnode,*HuffmanTree; typedef struct{int bits[30];int start;}huffcode;void numbers(int q){int num=10000;int i,j,x1,x2,n,c,p;float m1,m2;char ch,sh;FILE *fp;char filename[30];printf("请给新文件命名:");scanf("%s",filename);fp=fopen(filename,"w+");n=10;float sum[10]={0};for(i=1; i<=num; i++){ch=rand()%10;sum[ch]++;printf("%c",ch+'0');fprintf(fp,"%c",ch+'0');//fclose(fp);}fflush(stdin);printf("\n\n\n\n\t\t以上就是产生的所有随机数!\n\n"); printf("\t\t按回车键继续!");scanf("%c",&sh);system("cls");printf("\n\n\n\n\n\n\n\n\n\t\t***************** ****************************\n");printf("\t\t* 接下来为你计算各个数字权值(请稍等)! *\n");printf("\t\t********************************* ************");Sleep(4*1000);fflush(stdin);//scanf("%c",&sh);system("cls");printf("\n\n\n\n\n\n\n\n\n\t\t计算完毕!");scanf("%c",&sh);system("cls");printf("\t\t各数字权值如下:\n");for(i=0;i<n;i++){printf("\t\t%d\t%f\n",i,sum[i]/10000);}scanf("%c",&sh);huffnode huff_node[19];huffcode huff_code[10],cd;for(i=0;i<2*n-1;i++){huff_node[i].weight=0;huff_node[i].parent=0;huff_node[i].flag=0;huff_node[i].lchild=0;huff_node[i].rchild=0;}for(i=0;i<n;i++){huff_node[i].weight=sum[i];}for(i=0;i<n-1;i++){m1=m2=20000;x1=x2=0;for(j=0;j<n+i;j++){if(huff_node[j].weight<m1&&huff_node[j].flag==0){m2=m1;x2=x1;m1=huff_node[j].weight;x1=j;}else if(huff_node[j].weight<m2&&huff_node[j].flag==0){m2=huff_node[j].weight;x2=j;}}huff_node[x1].parent=n+i;huff_node[x2].parent=n+i;huff_node[x1].flag=1;huff_node[x2].flag=1;huff_node[n+i].weight=huff_node[x1].weight+huff _node[x2].weight;huff_node[n+i].lchild=x1;huff_node[n+i].rchild=x2;}for(i=0;i<n;i++){cd.start=n-1;c=i;p=huff_node[c].parent;while(p!=0){if(huff_node[p].lchild==c)cd.bits[cd.start]=0;elsecd.bits[cd.start]=1;cd.start--;c=p;p=huff_node[p].parent;}cd.start++;for(j=cd.start;j<n;j++)huff_code[i].bits[j]=cd.bits[j];huff_code[i].start=cd.start;}puts("各数字的哈夫曼编码是:");for(i=0;i<n;i++){printf("%d ",i);for(j=huff_code[i].start;j<n;j++)printf("%10d",huff_code[i].bits[j]);printf("\n");}HuffmanTree t;char str[500];fflush(stdin);scanf("%c",&sh);system("cls");//fflush(stdin);//scanf("%c",&sh);puts("\t\t***************************"); puts("\t\t* 下面开始哈夫曼解码*");puts("\t\t***************************"); for(i=0;i<n;i++){printf("\t%d ",i);for(j=huff_code[i].start;j<n;j++)printf("%10d",huff_code[i].bits[j]);printf("\n");}while(1){state2:printf("请输入待解码:");scanf("%s",str);int L=strlen(str);for(j=0;j<L;j++){if(str[j]!='0'&&str[j]!='1'&&str[j]!='\0'){puts("待解码中有错误码,请重新输入!");goto state2;}}j=0;while(j<L){t=&huff_node[2*n-2];while(t->lchild||t->rchild){if(str[j]=='0'){i=t->lchild;t=&huff_node[i];}else if(str[j]=='1'){i=t->rchild;t=&huff_node[i];}elsegoto state1;j++;}printf("%d",i);}state1:printf("\n");}}void Capital_letters(int q){int num=10000;int i,j,x1,x2,n,c,p;float m1,m2;char ch,sh;FILE *fp;char filename[30];printf("请给新文件命名:");scanf("%s",filename);fp=fopen(filename,"w+");n=26;float sum[26]={0};for(i=1; i<=num; i++){ch=rand()%26+'A';sum[ch-'A']++;printf("%c",ch);fprintf(fp,"%c",ch);//fclose(fp);}fflush(stdin);printf("\n\n\n\n\t\t以上就是产生的所有随机数!\n\n"); printf("\t\t按回车键继续!");scanf("%c",&sh);system("cls");printf("\n\n\n\n\n\n\n\n\n\t\t***************** ****************************\n");printf("\t\t* 接下来为你计算各个字符权值(请稍等)! *\n");printf("\t\t********************************* ************");Sleep(4*1000);fflush(stdin);//scanf("%c",&sh);system("cls");printf("\n\n\n\n\n\n\n\n\n\t\t计算完毕!");scanf("%c",&sh);system("cls");printf("\t\t各数权值如下:\n");for(i=0;i<n;i++){printf("\t\t%c\t%f\n",i+'A',sum[i]/10000);}scanf("%c",&sh);huffnode huff_node[51];huffcode huff_code[26],cd;for(i=0;i<2*n-1;i++){huff_node[i].weight=0;huff_node[i].parent=0;huff_node[i].flag=0;huff_node[i].lchild=0;huff_node[i].rchild=0;}for(i=0;i<n;i++){huff_node[i].weight=sum[i];}for(i=0;i<n-1;i++){m1=m2=20000;x1=x2=0;for(j=0;j<n+i;j++){if(huff_node[j].weight<m1&&huff_node[j].flag==0){m2=m1;x2=x1;m1=huff_node[j].weight;x1=j;}else if(huff_node[j].weight<m2&&huff_node[j].flag==0){m2=huff_node[j].weight;x2=j;}}huff_node[x1].parent=n+i;huff_node[x2].parent=n+i;huff_node[x1].flag=1;huff_node[x2].flag=1;huff_node[n+i].weight=huff_node[x1].weight+huff _node[x2].weight;huff_node[n+i].lchild=x1;huff_node[n+i].rchild=x2;}for(i=0;i<n;i++){cd.start=n-1;c=i;p=huff_node[c].parent;while(p!=0){if(huff_node[p].lchild==c)cd.bits[cd.start]=0;elsecd.bits[cd.start]=1;cd.start--;c=p;p=huff_node[p].parent;}cd.start++;for(j=cd.start;j<n;j++)huff_code[i].bits[j]=cd.bits[j];huff_code[i].start=cd.start;}puts("各字符的哈夫曼编码是:");for(i=0;i<n;i++){printf("%c ",i+'A');for(j=huff_code[i].start;j<n;j++)printf("%10d",huff_code[i].bits[j]);printf("\n");}HuffmanTree t;char str[500];fflush(stdin);scanf("%c",&sh);system("cls");//fflush(stdin);//scanf("%c",&sh);puts("\t\t***************************"); puts("\t\t* 下面开始哈夫曼解码*");puts("\t\t***************************"); for(i=0;i<n;i++){printf("\t%c ",i+'A');for(j=huff_code[i].start;j<n;j++)printf("%10d",huff_code[i].bits[j]);printf("\n");}while(1){state2:printf("请输入待解码:");scanf("%s",str);int L=strlen(str);for(j=0;j<L;j++){if(str[j]!='0'&&str[j]!='1'&&str[j]!='\0'){puts("待解码中有错误码,请重新输入!");goto state2;}}j=0;while(j<L){t=&huff_node[2*n-2];while(t->lchild||t->rchild){if(str[j]=='0'){i=t->lchild;t=&huff_node[i];}else if(str[j]=='1'){i=t->rchild;t=&huff_node[i];}elsegoto state1;j++;}printf("%c",i+'A');}state1:printf("\n");}}void Lower_letters(int q){int num=10000;int i,j,x1,x2,n,c,p;float m1,m2;char ch,sh;FILE *fp;char filename[30];printf("请给新文件命名:");scanf("%s",filename);fp=fopen(filename,"w+");n=26;float sum[26]={0};for(i=1; i<=num; i++){ch=rand()%26+'a';sum[ch-'a']++;printf("%c",ch);fprintf(fp,"%c",ch);//fclose(fp);}fflush(stdin);printf("\n\n\n\n\t\t以上就是产生的所有随机数!\n\n"); printf("\t\t按回车键继续!");scanf("%c",&sh);system("cls");printf("\n\n\n\n\n\n\n\n\n\t\t***************** ****************************\n");printf("\t\t* 接下来为你计算各个数字权值(请稍等)! *\n");printf("\t\t********************************* ************");Sleep(4*1000);fflush(stdin);//scanf("%c",&sh);system("cls");printf("\n\n\n\n\n\n\n\n\n\t\t计算完毕!");scanf("%c",&sh);system("cls");printf("\t\t各数权值如下:\n");for(i=0;i<n;i++){printf("\t\t%c\t%f\n",i+'a',sum[i]/10000);}scanf("%c",&sh);huffnode huff_node[51];huffcode huff_code[26],cd;for(i=0;i<2*n-1;i++){huff_node[i].weight=0;huff_node[i].parent=0;huff_node[i].flag=0;huff_node[i].lchild=0;huff_node[i].rchild=0;}for(i=0;i<n;i++){huff_node[i].weight=sum[i];}for(i=0;i<n-1;i++){m1=m2=20000;x1=x2=0;for(j=0;j<n+i;j++){if(huff_node[j].weight<m1&&huff_node[j].flag==0){m2=m1;x2=x1;m1=huff_node[j].weight;x1=j;}else if(huff_node[j].weight<m2&&huff_node[j].flag==0){m2=huff_node[j].weight;x2=j;}}huff_node[x1].parent=n+i;huff_node[x2].parent=n+i;huff_node[x1].flag=1;huff_node[x2].flag=1;huff_node[n+i].weight=huff_node[x1].weight+huff _node[x2].weight;huff_node[n+i].lchild=x1;huff_node[n+i].rchild=x2;}for(i=0;i<n;i++){cd.start=n-1;c=i;p=huff_node[c].parent;while(p!=0){if(huff_node[p].lchild==c)cd.bits[cd.start]=0;elsecd.bits[cd.start]=1;cd.start--;c=p;p=huff_node[p].parent;}cd.start++;for(j=cd.start;j<n;j++)huff_code[i].bits[j]=cd.bits[j];huff_code[i].start=cd.start;}puts("各字符的哈夫曼编码是:");for(i=0;i<n;i++){printf("%c ",i+'a');for(j=huff_code[i].start;j<n;j++)printf("%10d",huff_code[i].bits[j]);printf("\n");}HuffmanTree t;char str[500];fflush(stdin);scanf("%c",&sh);system("cls");//fflush(stdin);//scanf("%c",&sh);puts("\t\t***************************"); puts("\t\t* 下面开始哈夫曼解码*");puts("\t\t***************************"); for(i=0;i<n;i++){printf("\t%c ",i+'a');for(j=huff_code[i].start;j<n;j++)printf("%10d",huff_code[i].bits[j]);printf("\n");}while(1){state2:printf("请输入待解码:");scanf("%s",str);int L=strlen(str);for(j=0;j<L;j++){if(str[j]!='0'&&str[j]!='1'&&str[j]!='\0'){puts("待解码中有错误码,请重新输入!");goto state2;}}j=0;while(j<L){t=&huff_node[2*n-2];while(t->lchild||t->rchild){if(str[j]=='0'){i=t->lchild;t=&huff_node[i];}else if(str[j]=='1'){i=t->rchild;t=&huff_node[i];}elsegoto state1;j++;}printf("%c",i+'a');}state1:printf("\n");}}void menu(){system("cls");printf("\t========================== ============\n");printf("\t||||\n");printf("\t|| 随机字符有三种类型:||\n");printf("\t|| 0:数字||\n");printf("\t|| 1:小写字母||\n");printf("\t|| 2:大写字母||\n");printf("\t||||\n");printf("\t========================== ============\n");printf("\t 请选择你需要的字符类型(0-2):"); }void main(){while(1){int choose;menu();scanf("%d",&choose);switch(choose){case 0:numbers(choose);break;case 1:Capital_letters(choose);break;case 2:Lower_letters(choose);break;default:printf("\n\t\t输入有误!!请重新输入!!!");fflush(stdin);Sleep(3*1000);system("cls");menu();}}}。

相关主题