/*
============================================================================
Name : Exercise.c
Author : Haier
Version : 1.01
Copyright : Copyright (c) 2014
Description : Huffman Coding in C, Ansi-style,Compile by Code:Block
============================================================================
*/
#include <stdio.h>
#define MAXLEN (10)
#define MAXNODE (20)
typedef struct huffnode /*哈夫曼树节点结构*/
{
int weight;
int flag;
int parent;
int lchild;
int rchild;
}huffnode;
typedef struct huffcode /*哈夫曼编码节点结构*/
{
int bits[MAXLEN];
int start;
}huffcode;
int main()
{
huffnode huff_node[MAXNODE];
huffcode huff_code[MAXLEN],Temp;
int NumberOfNode,i,j,Smallest=32767,SecondSmallest=32767;
int SmallestIndex=0,SecondSmallestIndex=0;
int Parent,CurrentNode;
/*第一部分:构造哈夫曼树*/
printf("Please input the number of node: ");
scanf("%d",&NumberOfNode);
for(i=0; i<2*NumberOfNode-1; i++)
{
huff_node[i].weight=0;
huff_node[i].flag =0;
huff_node[i].lchild=-1;
huff_node[i].rchild=-1;
huff_node[i].parent=0;
}
for(i=0; i<NumberOfNode; i++)
{
printf("\nPlease input the weight of %d node: ",i+1);
scanf("%d",&huff_node[i].weight);
}
for(i=0; i<NumberOfNode-1; i++)
{
Smallest=32767;
SecondSmallest=32767;
SmallestIndex=0;
SecondSmallestIndex=0;
for(j=0; j<NumberOfNode+i; j++)
{
if(huff_node[j].flag==0 && huff_node[j].weight<Smallest)
{
SecondSmallest=Smallest;
SecondSmallestIndex=SmallestIndex;
Smallest=huff_node[j].weight;
SmallestIndex = j;
}
else if(huff_node[j].flag==0 && huff_node[j].weight<SecondSmallest)
{
SecondSmallest=huff_node[j].weight;
SecondSmallestIndex=j;
}
}
huff_node[SmallestIndex].parent =NumberOfNode+i;
huff_node[SecondSmallestIndex].parent=NumberOfNode+i;
huff_node[SmallestIndex].flag =1;
huff_node[SecondSmallestIndex].flag =1;
huff_node[NumberOfNode+i].lchild =SmallestIndex;
huff_node[NumberOfNode+i].rchild =SecondSmallestIndex;
huff_node[NumberOfNode+i].weight=huff_node[SmallestIndex].weight+huff_node[SecondSmallestIndex].weight;
}
/*第二部分:求哈夫曼编码*/
for(i=0; i<NumberOfNode; i++)
{
Temp.start=NumberOfNode;
Parent=huff_node[i].parent;
while(Parent)
{
if(huff_node[Parent].lchild==i)
{
Temp.bits[Temp.start]=0;
}
else
{
Temp.bits[Temp.start]=1;
}
Temp.start-=1;
Parent=huff_node[Parent].parent;
}
for(j=(Temp.start+1); j<=NumberOfNode; j++)
{
huff_code[i].bits[j]=Temp.bits[j];
}
huff_code[i].start=Temp.start+1;
}
/*第三部分:输出编码*/
for(i=0; i<NumberOfNode; i++)
{
for(j=huff_code[i].start; j<=NumberOfNode; j++)
{
printf("%d,",huff_code[i].bits[j]);
}
printf("\n");
}
}
哈夫曼编码算法
最新推荐文章于 2024-02-24 18:39:30 发布