haffuman.cpp

来自「哈夫曼树的一个简单的实现」· C++ 代码 · 共 153 行

CPP
153
字号
#include<stdio.h>
#define MAX 21 

typedef struct
{
 char data;
 int wei;
 int par;
 int left;
 int right;
} huffn; 

typedef struct
{
 char cd[MAX];
 int start;
}huffc; 





 void printmap()
 {
	printf("请输入元素的个数:  15\n");
	printf("第1个元素	结点值:a   	权值为: 1192\n");
	printf("第2个元素	结点值:b    	权值为: 677\n");
	printf("第3个元素	结点值:c    	权值为: 541\n");
	printf("第4个元素	结点值:d	权值为: 518\n");
	printf("第5个元素	结点值:e	权值为: 462\n");
	printf("第6个元素	结点值:f	权值为: 450\n");
	printf("第7个元素	结点值:g	权值为: 242\n");
	printf("第8个元素	结点值:h	权值为: 195\n");
	printf("第9个元素	结点值:i	权值为: 190\n");
	printf("第10个元素	结点值:j	权值为: 181\n");
	printf("第11个元素	结点值:k	权值为: 174\n");
	printf("第12个元素	结点值:l	权值为: 157\n");
	printf("第13个元素	结点值:m	权值为: 138\n");
	printf("第14个元素	结点值:n	权值为: 124\n");
	printf("第15个元素	结点值:o	权值为: 123\n");
	
	printf("哈夫曼编码:\n");
	printf("a:01\n");
	printf("b:101\n");
	printf("c:001\n");
	printf("d:000\n");
	printf("e:1110\n");
	printf("f:1101\n");
	printf("g:11110\n");
	printf("h:11001\n");
	printf("i:11000\n");
	printf("j:10011\n");
	printf("k:10010\n");
	printf("l:10001\n");
	printf("m:10000\n");
	printf("n:111111\n");
	printf("o:111110\n");

 }




int main(void)
{
 huffn ht[2*MAX];
 huffc hcd[MAX],d;
 int i,k,f,l,r,n,c,m1,m2;
 printf("按任意键导出题目报告图:\n");
 getchar();
 printmap();
 printf("按任意键继续测试程序:\n");
 getchar();
 
 printf("请输入元素的个数:  ");
 scanf("%d",&n);
 for(i=1;i<=n;i++)
 {
  getchar();
  printf("第%d个元素\n结点值:",i);
   scanf("%c",&ht[i].data);
  printf("权值为: ");
   scanf("%d",&ht[i].wei);
 }
 for(i=1;i<=2*n-1;i++)
  ht[i].par=ht[i].right=ht[i].left=0; 
 for(i=1+n;i<=2*n-1;i++)
 {
  m1=m2=32767;
  l=r=0;
  for(k=1;k<=i-1;k++)
  {
   if(ht[k].par==0)
   
    if(ht[k].wei<m1) 

    {
     m2=m1;
     r=l;
     m1=ht[k].wei;
     l=k;
   
   }
    else if(ht[k].wei<m2)
    {
     m2=ht[k].wei;
     r=k;
    }
  }
    ht[l].par=i;
    ht[r].par=i;
    ht[i].wei=ht[l].wei+ht[r].wei;
    ht[i].left=l;
    ht[i].right=r;
 }

printf("哈夫曼编码:  \n"); 

 for(i=1;i<=n;i++)
 {
  d.start=n-1;
  
  c=i;
  f=ht[i].par;
  while(f!=0)
  {
             --d.start;
   if(ht[f].left==c)
    d.cd[d.start]='0';
   else
    d.cd[d.start]='1';
   c=f;
   f=ht[f].par;
  }
  
  hcd[i]=d;



 printf("%c:",ht[i].data);
    for(k=hcd[i].start;k<n-1;k++)
       printf("%c",hcd[i].cd[k]);
 printf("\n"); 



  
 }

return 1;
} 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?