Пример #1
0
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
Пример #2
0
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;
}
Пример #4
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);
}
Пример #5
0
Файл: main.c Проект: nilzyj/test
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;
}
Пример #6
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;
}
Пример #7
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]);
 }
Пример #8
0
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;
}
Пример #9
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]);
	}
}
Пример #10
0
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
Пример #11
0
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);  
}  
Пример #12
0
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);  
}