哈夫曼树编码

          终于会哈夫曼编码了,那就把代码发上去了,这周我们课设了,感觉自己好颓废,过了几天糜烂的生活,自己也不知道怎么回事,有些事也就是那个样子,不要因为其他人影响自己的情绪,对自己好点,说到还要做到,不仅嘴上说说而已。我昨天一个人去,就一个人去的,一个人的感觉也不错嘛,想做什么就做什么,自己的情绪也好多了,就像我说Low·魂淡想怎样就怎样痛怎样伤怎样,任何时候都不要让自己的心累。别笑我,幼稚的轻狂,

          其实这次自己做了3个调用函数,一个创建,一个输出,一个标记最小值,注意有个for语句空循环;

 

          

//#include <iostream>
#include<stdio.h>
#include<stdlib.h>

typedef struct node{
	char data;
	int weight;
	int left,right;
    int parent;
}Huffman;

void select(Huffman *G,int n,int *s1,int *s2){
	int i;
	printf("输出前%d个结点的数据,左右孩子,双亲 ,权值:\n",n);
	for(i=0;i<n;i++)
	{
		printf("%3c%3d%3d%3d%3d\n",G[i].data,G[i].left,G[i].right,G[i].parent,G[i].weight);
	}
	for(*s1=0;*s1<n;(*s1)++)
	{ 
	    if(G[*s1].parent==-1)
	      {
	  
	      	break;
	      }        
	}
	for(*s2=*s1+1;*s2<n&&G[*s2].parent!=-1;*s2=*s2+1);

	for(i=*s2;i<n;i++){
	   if(G[i].parent==-1)
        {
	    	if(G[i].weight<G[*s1].weight)
		    {
			 *s2=*s1;
			 *s1=i;
		    }
	    
	        else if(G[i].weight<G[*s2].weight)
	        {
	    	   *s2=i;
	        }
	    }
	}	
}
void CreateHuffman(Huffman *G,int n){
	int i;
	int s1,s2;
	for(i=0;i<n;i++){
		fflush(stdin);
		printf("请你输入第%d个节点的数据和权值: ",i+1);
		scanf("%c%d",&G[i].data,&G[i].weight);
		G[i].parent=-1;
		G[i].left=-1;
		G[i].right=-1;
	}
	for(i=n;i<2*n-1;i++){
		select(G,i,&s1,&s2);
		G[i].weight=G[s1].weight+G[s2].weight;
		G[i].left=s1;
		G[i].right=s2;
		G[i].parent=-1;
		G[i].data=' ';
		G[s2].parent=G[s1].parent=i;
	}	
}
void PrintHuffNode(Huffman *G,int n){
	
	int i,k,start=0,j;
	int temp;
	char ch;
	char r[10]={'\0'};
    for(i=0;i<n;i++)
    {
		j=i;
		ch=G[j].data;
		start=0;
	  while(G[j].parent!=-1){
		temp=G[j].parent;
		if(G[temp].left==i){
	    	r[start++]='0';	    	
		}
		else{
		   r[start++]='1';	
		}
		j=temp;
	  }	  
	  printf("\n输出符号%c的哈弗曼编码为:",ch);
	  for(k=start-1;k>=0;k--)
	  {
	  	printf("%c",r[k]);
		r[k]='\0';
	  }

    	printf("\n");
	}
	
}
int main(int argc, char** argv) {
    Huffman *G;
    int n;
	char a[50]={'\0'};
    printf("please input vertxe number: ");
    scanf("%d",&n);
    G=(Huffman *)malloc((2*n-1)*sizeof(Huffman));
    CreateHuffman(G,n);
	PrintHuffNode(G,n);
    
	return 0;
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值