C语言数据结构课程设计-哈夫曼编码

哈夫曼编码源程序

#include <stdio.h>
#define MAXLEN 100
typedef struct                         	/*定义结构体*/
{	int weight;                      	/*定义一个整型权值变量*/
	int lchild,rchild,parent;     	    /*定义左、右孩子及双亲指针*/
}HTNode;
typedef  HTNode  HT[MAXLEN];     	    /*向量类型*/
int n;
void InitHFMT (HT  T)             	    /*初始化子函数*/  
{	int i;
	printf ("\n请输入共有多少个权值(小于100):");
	scanf ("%d",&n);
	for (i=0; i<2*n-1; i++)
	{	T[i].weight=0;
		T[i].lchild=-1;
		T[i].rchild=-1;
		T[i].parent=-1;
	}
}
void InputWeight(HT T)           	    /*输入权值子函数*/
{	int w,i;
	for (i=0; i<n;i++)
	{	printf ("输入第%d个权值:",i+1);
		scanf ("%d",&w);getchar();
		T[i].weight=w;  
	}
}
void SelectMin (HT T, int i, int *p1,int *p2)   /*选择两个结点中小的结点*/
{	long min1=888888,min2=888888;           	/*预设两个值,并使它大于可能出现的最大权值*/     
	int j;
	for (j=0;j<=i;j++)
	{  if(T[j].parent==-1)
	   {    if (min1>T[j].weight)
			{	min1=T[j].weight;    	/*找出最小的权值*/
				*p1=j;            	    /*/通过*p1带回序号*/
			}
	   }
	}
	for (j=0;j<=i;j++)
	{   if (T[j].parent==-1)
		{   if (min2>T[j].weight&&j!=(*p1))
			{  min2=T[j].weight;     	/*找出次最小的权值*/
			   *p2=j;	          	    /*通过*p2带回序号*/
			}
		}
	}
}                                     

void CreatHFMT (HT T)       		   /*构造哈夫曼树,T[2*n-1]为其根结点*/
{	int i,p1,p2;
	InitHFMT (T);
	InputWeight(T);
	for(i=n;i<2*n-1;i++)
	{	SelectMin(T,i-1,&p1,&p2);
		T[p1].parent=T[p2].parent=i;
		T[i].lchild=T[p1].weight;
		T[i].rchild=T[p2].weight;
		T[i].weight=T[p1].weight+T[p2].weight;
	}
}

void PrintHFMT (HT T)            	/*输出向量状态表*/
{	
     
    int i,k=0;
    printf("\n哈夫曼树的各边显示:\n");
	for (i=0; i<2*n-1; i++)
        while(T[i].lchild!=-1)
		{   		 
            printf("(%d,%d),(%d,%d)\n",T[i].weight,T[i].lchild,T[i].weight,T[i].rchild);
			break;
		}
}

void hfnode(HT T,int i,int j)     
{	j=T[i].parent;
	if (T[j].rchild==T[i].weight) 
		printf("1");
	else               
		printf("0");
	if(T[j].parent!= -1) 
		i=j,hfnode (T,i,j);
}
void huffmannode(HT T)            	/*求哈夫曼编码*/
{ 	
    int i,j,a;
    printf("\n输入的权值的对应哈夫曼编码:");
	for (i=0;i<n;i++)
	{	j=0;
		a=i;
 		printf("\n%i的编码为:",T[i].weight); 
		hfnode(T,i,j);
		i=a;
	}
}

void main()                        	/*主函数*/
{	HT HT;
	CreatHFMT(HT);
	PrintHFMT(HT);
    huffmannode(HT);
	printf("\n	");
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值