#include "stdio.h" #include "string.h" #define swap(type, x,y) do{type t;t=x;x=y;y=t;} while(0) char srcCode[]="TONARI NO KYAKU WA YOKU KAKI KUU KYAKU DA";/*元データ*/ int pntDT=0; char charDT[257]; int freqDT[257];/*頻度表(番人付き探索を使うので256+1に*/ /*(注意)文字列の長さの最大値は65,536なので文字列の添え字はunsignedにする*/ char Huffman[1024]={0};unsigned int ppHuff=0, bpHuff=0;/*Huffman Code格納領域*/ int searchDT(char DT){/*頻度表検索(番人付き探索)*/ int i=0; charDT[pntDT]=DT; freqDT[pntDT]=0; while(charDT[i]!=DT) i++; if(i>=pntDT) pntDT++;/*見つからなかった場合,表の大きさを+1*/ return i; } void freqCount(){/*頻度カウント*/ for(int i=0;srcCode[i]!=0;i++)freqDT[searchDT(srcCode[i])]++; } void sortFreq(){/*頻度降順にソート(バブルソート)*/ for(int i=0;ii;j--) if(freqDT[j-1]=8){bpHuff=0; ppHuff++;} } void setHuffman(){/*ハフマン符号化*/ unsigned int N=strlen(srcCode);/*文字列の長さ*/ for(unsigned int i=0; i=8){(*j)=0; (*i)++;} } void getHuffman(char str[]){/*ハフマン符号から文字列取得*/ int i=0,j=0, p=0; unsigned int N=strlen(srcCode); for(unsigned int k=0;k