哈夫曼编码 译码c语言,哈夫曼编码译码系统(c/c++)

哈夫曼编码译码系统的实现,主要包含三部分:

1、创建哈夫曼树

2、编码函数

3、译码函数

编写代码时为了方便,在这里混用了c++的输入输出流。主体用c语言实现。

下面是代码部分:

1、头文件,以及储存结构:

#include

#include

using namespace std;

#define MAX 2000

typedef char ElemType;

typedef struct{

ElemType data;

int w;

int parent,lchild,rchild;

}HFMTNode;

2、哈夫曼树的创建,Ht储存全部节点的权值,n代表叶子节点数量。

void menu(HFMTNode Ht [],int n);//原型声明

void CreatHFMTree(HFMTNode Ht[],int n)//创建哈夫曼树

{

int i,j,k,lmin,rmin;

int min1,min2,m1;

for(i=1;i<2*n;i++)

{

Ht[i].parent=Ht[i].lchild=Ht[i].rchild=-1;

}

for(i=n+1;i<2*n;i++)

{

min1=min2=MAX;

lmin=rmin=-1;

for(k=1;k

{

if(Ht[k].parent==-1)//只在尚未构造的二叉树节点中运行

{

if(Ht[k].w

{

min2=min1;

rmin=lmin;

min1=Ht[k].w;

lmin=k;

}

else

{

if(Ht[k].w

{

min2=Ht[k].w;

rmin=k;

}

}

}

else{

if(Ht[k].wm1)//与创建好的二叉树节点比较,选取w小的一个

{

min2=Ht[k].w;

rmin=k;

m1=k;

}

}

}

Ht[lmin].parent=i;//对选择出的结点进行连接

Ht[rmin].parent=i;

Ht[i].w=Ht[lmin].w+Ht[rmin].w;

Ht[i].lchild=lmin;

Ht[i].rchild=rmin;

}

printf("HFMTree have been created\n");

}

3、编码译码函数、主函数:

void encoding(HFMTNode Ht [],int n)//编码

{

int k;

fflush(stdin);

printf("Please input what you want to encode with the ending of'#' :\n");

char ch;

ch=getchar(); //读取字符

while (ch!='#')

{

for(k=1;k<=n;k++)

{

if(Ht[k].data==ch)

{

break;

}

} //找到字符位置

HFMTNode temp1,temp=Ht[k];

int flag=0;

int a[n];

while(temp.w!=Ht[2*n-1].w)

{

temp1=temp;

temp=Ht[temp.parent];

if(Ht[temp.lchild].w==temp1.w )

{

a[flag]=0;

flag++;

}

else if(Ht[temp.rchild].w==temp1.w )

{

a[flag]=1;

flag++;

}

} //用数组记录路径

for(int f=flag-1;f>=0;f--)

{

printf("%d",a[f]);

} //编码输出

ch=getchar();

}

printf("\nencoding have finished\n");

system("pause");

system("cls");

menu(Ht,n);

}

void decoding(HFMTNode Ht [],int n)//译码

{

int k=2*n-1;

fflush(stdin);

printf("Please input what you want to decode with the ending of'#' :\n");

char ch;

ch=getchar(); //依次读取01字符

HFMTNode temp=Ht[2*n-1];

while (ch!='#')

{

if(ch=='1')

{

if(temp.rchild==-1)

{

printf("%c",temp.data); //根据01向左右寻找,到达叶子节点时输出

temp=Ht[2*n-1];

continue;

}

else

{

temp=Ht[temp.rchild ];

ch=getchar();

}

}

else if(ch=='0')

{

if(temp.lchild==-1)

{

printf("%c",temp.data);

temp=Ht[2*n-1];

continue;

}

else

{

temp=Ht[temp.lchild ];

ch=getchar();

}

}

}

printf("%c",temp.data); //输出要译码的最后一个字符

printf("\ndecoding have finished\n");

system("pause");

system("cls");

menu(Ht,n);

}

void menu(HFMTNode Ht [],int n)

{

int j;

printf("Input your choice:\n");

printf("1.encoding 2.decoding 0.exit\n");

cin>>j;

switch (j)

{

case 1:encoding(Ht,n);break;

case 2:decoding(Ht,n);break;

case 0:break;

}

}

int main()

{

printf("Please input the amount of the node:\n");

int i;

scanf("%d",&i);

HFMTNode Ht[2*i];//储存各个节点的数据

for(int k=1;k<=i;k++)

{

printf("Ht[%d]:Please input data :",k);

cin>>Ht[k].data;

printf("Ht[%d]:Please input w :",k);

cin>>Ht[k].w;

}

CreatHFMTree(Ht,i);

menu(Ht,i);

return 0;

}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值