|
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h>
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("\n");
OutputWeight(Data,strlen(Data), &WhatLetter, &Weight, &Count);
HuffmanCoding(&HT,&HC,Weight,Count);
printf(" Letter Weight Code\n"); for(i=0;i<Count;i++) { printf(" %c ",WhatLetter[i]); printf("%d ",Weight[i]); printf("%s\n",HC[i+1]); } printf("\n"); 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) { temp1=HT[i].Weight; (*s1)=i; } else { if(temp2==0) { temp2=HT[i].Weight; (*s2)=i; if(temp2<temp1) { temp3=temp2; temp2=temp1; temp1=temp3;
temp3=(*s2); &n
bsp; (*s2)=(*s1); (*s1)=temp3; } } else {   [1] [2] 下一页 |