龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

霍夫曼树编码的实现

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
#include #include #include #include typedef strUCt { unsigned int Weight; unsigned int Parent; unsigned int lChild; unsigned int rChild; }HTNode,*HuffmanTree; typedef char **HuffmanCode; int LookFor(char *str,char letter,int count); void Ou

  #include

  

#include

  

#include

  

#include

  

  

typedef strUCt

  

{

  

unsigned int Weight;

  

unsigned int Parent;

  

unsigned int lChild;

  

unsigned int rChild;

  

}HTNode,*HuffmanTree;

  

  

typedef char **HuffmanCode;

  

  

int LookFor(char *str,char letter,int count);

  

void OutputWeight(char *Data,int Length,

  

char **WhatLetter,

  

int **Weight,int *Count);

  

void HuffmanCoding(HuffmanTree *HT,

  

HuffmanCode *HC,

  

int *Weight,

  

int Count);

  

void Select(HuffmanTree HT,int Count,int *s1,int *s2);

  

int main()

  

{

  

HuffmanTree HT;

  

HuffmanCode HC;

  

char Data[100];

  

char *WhatLetter;

  

int *Weight;

  

int Count;

  

int i;

  

  

printf("Please input the line:");

  

/* Example: aaaaaaaaaaaaaabcccccc*/

  

scanf("%s",Data);

  

printf("

");

  

  

OutputWeight(Data,strlen(Data),

  

&WhatLetter,

  

&Weight,

  

&Count);

  

  

HuffmanCoding(&HT,&HC,Weight,Count);

  

  

printf(" Letter Weight Code

");

  

for(i=0;i

  

{

  

printf(" %c ",WhatLetter[i]);

  

printf("%d ",Weight[i]);

  

  

printf("%s

",HC[i+1]);

  

}

  

printf("

");

  

getch();

  

return 0;

  

}

  

  

void HuffmanCoding(HuffmanTree *HT,

  

HuffmanCode *HC,

  

int *Weight,

  

int Count)

  

{

  

int i;

  

int s1,s2;

  

int TotalLength;

  

HuffmanTree p;

  

char* cd;

  

unsigned int c;

  

unsigned int f;

  

int start;

  

  

if(Count<=1) return;

  

TotalLength=Count*2-1;

  

(*HT)=(HuffmanTree)malloc((TotalLength+1)*sizeof(HTNode));

  

  

p=((*HT)++);

  

for(i=1;i<=Count;i++)

  

{

  

(*HT)[i].Parent=0;

  

(*HT)[i].rChild=0;

  

(*HT)[i].lChild=0;

  

(*HT)[i].Weight=(*Weight);

  

Weight++;

  

}

  

for(i=Count+1;i<=TotalLength;i++)

  

{

  

(*HT)[i].Weight=0;

  

(*HT)[i].Parent=0;

  

(*HT)[i].lChild=0;

  

(*HT)[i].rChild=0;

  

}

  

/*///////////////////Create HuffmanTree////////////////*/

  

for(i=Count+1;i<=TotalLength;++i)

  

{

  

Select((*HT),i-1,&s1,&s2);

  

(*HT)[s1].Parent=i;

  

(*HT)[s2].Parent=i;

  

(*HT)[i].lChild=s1;

  

(*HT)[i].rChild=s2;

  

(*HT)[i].Weight=(*HT)[s1].Weight+(*HT)[s2].Weight;

  

  

}

  

/*///////////////////Output Huffman Code///////////////*/

  

(*HC)=(HuffmanCode)malloc((Count+1)*sizeof(char*));

  

cd=(char*)malloc(Count*sizeof(char));

  

cd[Count-1]='\0';

  

for(i=1;i<=Count;++i)

  

{

  

start=Count-1;

  

for(c=i,f=(*HT)[i].Parent;f!=0;c=f,f=(*HT)[f].Parent)

  

{

  

if((*HT)[f].lChild==c)

  

cd[--start]='0';

  

else

  

cd[--start]='1';

  

(*HC)[i]=(char*)malloc((Count-start)*sizeof(char));

  

strcpy((*HC)[i],&cd[start]);

  

}

  

}

  

}

  

void Select(HuffmanTree HT,int Count,int *s1,int *s2)

  

/*/(*s1) is smallest,(*s2) is smaller.*/

  

{

  

int i;

  

unsigned int temp1=0;

  

unsigned int temp2=0;

  

unsigned int temp3;

  

for(i=1;i<=Count;i++)

  

{

  

if(HT[i].Parent==0)

  

{

  

if(temp1==0)

  

{

  

&

  

精彩图集

赞助商链接