数据结构-哈夫曼编码

#include <stdio.h>
#include <malloc.h>

# define LIST_MAX_LENGTH 100

typedef struct SequentialList
{
	char character;
	int parent ;
	int direction;
	int weight;
} *SequentialListPtr ;

//初始化
SequentialListPtr SequentialListInit (char paraCharacter[] , int paraData[] , int paraLength ) 
{
	SequentialListPtr resultPtr = (SequentialListPtr) malloc (sizeof(struct SequentialList)*paraLength) ;
	if(resultPtr == NULL)
	{
		printf("内存分配失败!\n") ;
		return NULL ; // 返回指针 
	}
	
	int i = 0 ;
	for(i=0;i<paraLength;i++)
	{
		resultPtr[i].direction = -1 ;
		resultPtr[i].parent = -1 ;
		resultPtr[i].character= paraCharacter[i] ;
		resultPtr[i].weight = paraData[i] ;
	}
	
	return  resultPtr ;
}

//打印
void  SequentialListPrintf (SequentialListPtr tempList , int paraLength)
{
	int i = 0;
	for(i=0;i<paraLength;i++)
	{
		printf("%c\t",tempList[i].character) ;
		printf("%d\t",tempList[i].parent ) ;
		printf("%d\t",tempList[i].direction ) ;
		printf("%d\t\n",tempList[i].weight ) ;
	}
	
}

//找最小weight,并标记direction 
int findmin (SequentialListPtr tempList , int paraLength , int number)
{
	int min_value = 9999 ; //初始化一个最大值
	int min_index = -1 ; 
	
	int i = 0 ;
	for(i=0;i<paraLength;i++)
	{
		if( tempList[i].weight < min_value && tempList[i].direction == -1 )
		{
			min_value = tempList[i].weight ;
			min_index = i ;
		}
	}
	
	if(min_index != -1)
	{
			tempList[min_index].direction = number ;
	}
	
	
	return min_index ;
	
}



//构建哈夫曼树 
int Binarytree (SequentialListPtr tempList , int paraLength)
{	
	
	int i = 0 ;
	for(i=0;i<paraLength-1;i++)
	{
		if (paraLength >= LIST_MAX_LENGTH)
		 {
            printf("超出最大长度限制!\n");
            break;
        }
		//创建新节点
	    tempList[paraLength].weight = -1 ;
	    tempList[paraLength].character = '\0' ;
	    tempList[paraLength].parent = -1 ;
	    tempList[paraLength].direction = -1 ;   
	    
	    //合并两个节点
		int min0 = findmin(tempList,paraLength,0) ;
		int min1 = findmin(tempList,paraLength,1) ;
		
		if (min0 == -1 || min1 == -1)  //终点 (始终会打印)
		{
            // printf("无法找到足够的节点!\n");
            break;
        }
        
		tempList[paraLength].weight = tempList[min0].weight  + tempList[min1].weight ;
		
		
		//设置父节点
		tempList[min0].parent  =  paraLength ;
		tempList[min1].parent  =  paraLength ;
		
		paraLength++ ;
		
	}
	return paraLength ;
}

//找编码
int findencording (SequentialListPtr tempList , char ch ,int paraLength)
{
	int i = 0 ;
	for(i=0;i<paraLength;i++)
	{
		if(tempList[i].character == ch)
		{
			printf("the encording of %c is : ",ch);
			
			//临时存储编码
			int code[LIST_MAX_LENGTH] ;
			int code_length  = 0 ;
			
			int j = i ;
			
			while(tempList[j].parent != -1 )
			{
				code[code_length++] = tempList[j].direction ;
				j = tempList[j].parent ;
			}
			
			//反向打印
			for(j = code_length-1 ; j>=0;j--)
			{
				printf("%d",code[j]);
			 } 
			printf("\n");
			return 0 ;
		}
	}
	
	printf("cannot find the encording of %c\n",ch);
	return 0 ;
}

//text
void SequentialTest()
{
	int paraLength = 5 ;
	char paraCharacter[paraLength] ;
	int paraData[] = {52,8,15,23,2} ; //数据初始化 
	
	int i = 0 ;
	for(i=0;i<paraLength;i++)
	{
		paraCharacter[i] = 'a' + i ;
	}
	
	printf("---- SequentialTest begins. ---- \n") ;
	SequentialListPtr tempList = SequentialListInit(paraCharacter,paraData,paraLength);
	SequentialListPrintf(tempList,paraLength) ;
	
	printf("---- after Binarytree . ---- \n") ;
	paraLength = Binarytree(tempList,paraLength) ;
	SequentialListPrintf(tempList,paraLength) ;
	
	printf("---- after find encoding . ---- \n") ;
	findencording(tempList,'a',paraLength );
	findencording(tempList,'b',paraLength );
	findencording(tempList,'c',paraLength );
	findencording(tempList,'d',paraLength );
	findencording(tempList,'e',paraLength );
	
	free(tempList) ;
}

int main ()
{
	SequentialTest() ;
	return 0 ;
}

结果

    思路图~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值