哈夫曼树的编码译码(注释超详细)

​
#include 
#include        //malloc函数和free()函数用到 
#include       //strcpy函数用到 
#define N 30             //最大的叶子数目 
#define M 2*N-1         // 最大的结点个数(N个度为0的叶子结点,N-1个度为2的叶子节点) 
#define K 30             //要译码的01字符序列,最多30位 
#define MAXINT  32767         //32767


//三叉链表结点结构 
typedef struct
{
    int weight;               //结点的权值 
    int parent,Lchild,Rchild;	//结点的双亲,左孩子,右孩子 
}HTNode;


//search函数声明 
void search(HTNode huff[],int c,int *s1,int *s2);     //在前m项中找最小的权值和次小的权值 


//建立哈夫曼树 
void crthuff(HTNode huff[],int w[],int n)      //HTNode结构体数组huff[],每个结点的权值数组w,n个有效的叶子结点 
{
	int i;
	int s1,s2;               //声明语句给s1与s2分配了存储空间,s1是权值最小的结点的下标,s2是权值次小的结点的下标 
	int m=2*n-1;              //有效的结点总数为m
	for(i=1;i<=n;i++)         //huff[]数组与w[]数组都是从下标1开始的 
	huff[i]={w[i],0,0,0};     //初始化前n个叶子结点(记住这种给结构体数组赋值的方法) 
	for(i=n+1;i<=m;i++)       
	huff[i]={0,0,0,0};        //初始化从下标n+1到m的节点 
	for(i=n+1;i<=m;i++)        
	{                          
	    search(huff,i-1,&s1,&s2);   //在前i-1项中找权值最小的结点,传数组的时候只写数组名,&s1指的是下标的地址
	//	printf("最小权值的下标为:s1=%d s2=%d",s1,s2); 
	//    printf("最小的两个权值是%d %d",huff[s1].weight,huff[s2].weight);
	    huff[i].weight=huff[s1].weight+huff[s2].weight;
	    huff[i].Lchild=s1;       
	    huff[i].Rchild=s2;     
	    huff[s1].parent=i;
	    huff[s2].parent=i;
	}  
}



//找最小权值的两个节点,记住这个找最小的两个数的方法 
void search(HTNode huff[],int c,int *s1,int *s2)    //在数组的前c项中找,指针变量s1与s2,传过来的是下标的地址 
{                                                   //在该函数中 *s1是m1在数组中的下标,*s2是m2在数组中的下标
	int i,m1,m2;         //m1存放最小的权值,m2存放次小的权值
	m1=m2=MAXINT;          //先让m1与m2赋成最大 
	for(i=1;i<=c;i++)
	{
		if(huff[i].weight

在crthuffcode(HTNode huff[],int n)函数中,如果定义的是char **hc;定义了一个二重指针,那么在函数中应该首先hc=(char **)malloc(n*sizeof(char*));也就是应该首先给hc这个二重指针开辟空间,也就是给n个指向字符串的指针变量来分配空间,malloc函数的返回值是一个指针,指向该n个指针变量的首地址。
如果在该函数中,定义的是char *hc[n];并且没有hc=(char **)malloc(n*sizeof(char*));这句话,那么后面的hc[i]=(char *)malloc((n-start)*sizeof(char)); 这个语句只是在给每个指针变量所指向的字符串分配空间,而不是对该指针变量分配空间。所以该字符型指针数组中的每个元素还是没有一个明确的地址,只是一个在函数中的局部变量数组,那么在退出该函数的时候,这个局部变量数组会被释放,该数组的每个元素,即字符型的指针变量将丢失,在主函数中调用该函数时,除了第一个hc[1]有明确的指向外,其他的hc[i]所指向的都是不确定的字符。
运行结果:

哈夫曼树的编码译码(注释超详细)_第1张图片

你可能感兴趣的:(哈夫曼树的编码译码(注释超详细))