哈夫曼字符串编码c语言实现,哈夫曼算法构造代码

#include

#include

using namespace std;

struct Node{

char c;

int value;

int par;

char tag;    //tag='0',表示左边;tag='1',表示右边

bool isUsed;    //判断这个点是否已经用过

Node(){

par=-1;

isUsed=false;

}

};

int input(Node*,int);   //输入节点信息

int buildedTree(Node*,int); //建哈夫曼树

int getMin(Node*,int);  //寻找未使用的,具有最小频率值的节点

int outCoding(Node*,int);   //输出哈夫曼编码

int main ()

{

int n;

cin>>n;

Node *nodes=new Node[2*n-1];

input(nodes,n);

buildedTree(nodes,n);

outCoding(nodes,n);

delete(nodes);

return 0;

}

int input(Node* nodes,int n){

for(int i=0;i

cin>>(nodes+i)->c;

cin>>(nodes+i)->value;

}

return 0;

}

int buildedTree(Node* nodes,int n){

int last=2*n-1;

int t1,t2;

for(int i=n;i

t1=getMin(nodes,i);

t2=getMin(nodes,i);

(nodes+t1)->par=i; (nodes+t1)->tag='0';

(nodes+t2)->par=i; (nodes+t2)->tag='1';

(nodes+i)->value=(nodes+t1)->value+(nodes+t2)->value;

}

return 0;

}

int getMin(Node* nodes,int n){

int minValue=10000000;

int pos=0;

for(int i=0;i

{

if((nodes+i)->isUsed == false && (nodes+i)->value

minValue=(nodes+i)->value;

pos=i;

}

}

(nodes+pos)->isUsed=true;

return pos;

}

int outCoding(Node* nodes,int n){

char a[100];

int pos,k,j;

char tmp;

for(int i=0;i

k=0;

pos=i;

memset(a,'\0',sizeof(a));

while((nodes+pos)->par!=-1){

a[k++]=(nodes+pos)->tag;

pos=(nodes+pos)->par;

}

strrev(a);    //翻转字符串

cout<c<value<

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值