⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 huffman.cpp

📁 在电报收发、数据通信过程中
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define n 5
#define m 9
typedef char datatype;
typedef struct
{
	float weight;
	datatype data;
	int lchild,rchild,parent;
}hufmtree;
hufmtree tree[m];
typedef struct
{char bits[n];
int start;
datatype data;
}codetype;
codetype code[n];
void HUFFMAN()
{
	int i,j,p1,p2;
	char ch;
	float small1,small2,f;
	
	
	for(i=0;i<m;i++)
	{tree[i].parent=0;
	tree[i].lchild=0;
	tree[i].rchild=0;
	tree[i].weight=0.0;
	tree[i].data='0';
	}
	printf("输入每个叶子的权值和数据:\n");
	for(i=0;i<n;i++)
	{
		scanf("%f",&f);
		tree[i].weight=f;
		scanf("%s",&ch);
		tree[i].data=ch;
	}
	for(i=n;i<m;i++)
	{
		p1=p2=0;
	    small1=small2=1000.0;
	    for(j=0;j<=i-1;j++)
		if(tree[j].parent==0)
			if(tree[j].weight<small1)
			{
				small2=small1;
			    small1=tree[j].weight;
			    p2=p1;
			    p1=j;
			}else if(tree[j].weight<small2)
			{
				small2=tree[j].weight;
				p2=j;
			}
			tree[p1].parent=i;
			tree[p2].parent=i;
			tree[i].lchild=p1;
			tree[i].rchild=p2;
			tree[i].weight=tree[p1].weight+tree[p2].weight;
	}
	for(i=0;i<n;i++)
	{ printf("lchild=%d,data=%c,weight=%.0f,rchild=%d,parent=%d\n",tree[i].lchild,tree[i].data,tree[i].weight,tree[i].rchild,tree[i].parent);
	}

}
void HUFFMANCODE()
{
	int i,c,p,j;
    codetype cd;
    for(i=0;i<n;i++)
	{
		cd.start=n;
        c=i;
        p=tree[c].parent;
        cd.data=tree[c].data;
        while(p!=0)
		{
			cd.start--;
            if(tree[p].lchild==c) cd.bits[cd.start]='0';
            else cd.bits[cd.start]='1';
            c=p;
            p=tree[c].parent;
		}
        code[i]=cd;
	}
	for(i=0;i<n;i++){
		printf("data=%c,code=",code[i].data);
    for(j=code[i].start;j<n;j++)
	{
		printf("%c",code[i].bits[j]);
	}
	printf("\n");
	}
}
void OUT()
{
	printf("谢谢使用!\n");
}

void  main()
{
	int k;

	while(1)
	{
		printf("         ------------------------------\n");
		printf("         |         哈夫曼树           |\n");
		printf("         |============================|\n");
		printf("         |        1  构造哈夫曼树     |\n");
		printf("         |        2  哈夫曼编码       |\n");
        printf("         |        0  退出程序         |\n");
		printf("         ------------------------------\n");
		printf("         请输入选择的功能号:");
        scanf("%d",&k);
		switch(k)
		{
		case 1:  HUFFMAN();break;
		case 2:  HUFFMANCODE();break;
        case 0:  OUT();exit(1);
                
		}
	}
}

⌨️ 快捷键说明

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