void main(void) { int a[11]; int n = 10; BinaryTree<int> x; for (int i = 1; i <= n; i++) a[i] = 2*i; x = HuffmanTree(a,n); x.PostOutput(); }
/* Compress file */ void compressFile(FILE *fin, FILE *fout){ /* Create Huffman tree - indexed */ uint32_t numberOfChars = 0; queue *Huffman = HuffmanTree(fin, &numberOfChars); uint16_t numberOfNodes = countNodes(Huffman); treeIndexing(Huffman); /* Create TagHuffmanNode array */ createTagHuffmanVector(Huffman); /* Get codes for each character */ getCodes(Huffman, 0); /* Write in binary file - number of characters and number of nodes */ fwrite(&numberOfChars, sizeof(uint32_t), 1, fout); fwrite(&numberOfNodes, sizeof(uint16_t), 1, fout); /* Prase file */ unsigned char c; rewind(fin); int i, j; /* Write TagHuffmanNode array */ for(i = 0; i < indexTagHuffman; i++) fwrite(&vectorTagHuffman[i], sizeof(TagHuffmanNode), 1, fout); /* Parse file and binary compression */ char code = 0; int bitCount = 0; // number of bits while(fscanf(fin, "%c", &c) && !feof(fin)){ /* Search for character code */ for(i = 0; i < huffCodesCount; i++){ if (huffCode[i].caracter == c){ /* Write in file according to the code */ for(j = 0; j < huffCode[i].length; j++){ if(huffCode[i].code[j] == 0) code = code << 1; else code = (code << 1) | 1; bitCount++; /* Write in file when 8 bits are counted */ if(bitCount == 8){ fwrite(&code, sizeof(char), 1, fout); bitCount = 0; } } break; } } } /* Bits left */ if(bitCount != 0){ while(bitCount != 8){ code = code << 1; bitCount++; } fwrite(&code, sizeof(char), 1, fout); } /* Eliberare arbore */ freeTree(Huffman); }
void HuffmanCode() { HNodeType HuffNode[MAXNODE]; HCodeType HuffCode[MAXLEAF], cd[MAXLEAF]; int i, j, n, c; // n is the num of leaf HNodeType p; HuffmanTree(HuffNode); for (i = 0; i < n; i++) { cd[i].start = MAXBIT - 1; p = HuffNode[i].parent; j = MAXBIT - 1; c = i; for (p != -1) { if (p.lchild == c) cd[i].bit[cd[i].start] = 0; else cd[i].bit[cd[i].start] = 1; cd[i].start--; c = p; p = p.parent; } for (j = cd[i].start + 1; j <= MAXBIT - 1; j++) HuffCode[i].bit[j] = cd[i].bit[j]; HuffCode[i].start = cd[i].start; } for (i = 0; i < n; i++) { for (j = HuffCode[i].start + 1; j < MAXBIT - 1; j++) printf("%d", HuffCode[i].bit[j]); printf("\n"); } }
int main(void) { HNodeType HuffNode[MAXNODE]; /* 定义一个结点结构体数组 */ HCodeType HuffCode[MAXLEAF], cd; /* 定义一个编码结构体数组, 同时定义一个临时变量来存放求解编码时的信息 */ int i, j, c, p, n=0; char temc; FILE* fp = fopen("in.txt", "r"); //statistic character frequency while(~fscanf(fp, "%c", &temc)) freq[temc]++; fclose(fp); for (i=0; i<NSymbols; ++i) { if (freq[i]) { w[n] = freq[i]; sym[n] = i; n++; } } HuffmanTree (HuffNode, n); for (i=0; i < n; i++) { cd.start = n-1; c = i; p = HuffNode[c].parent; while (p != -1) /* 父结点存在 */ { if (HuffNode[p].lchild == c) cd.bit[cd.start] = 0; else cd.bit[cd.start] = 1; cd.start--; /* 求编码的低一位 */ c=p; p=HuffNode[c].parent; /* 设置下一循环条件 */ } /* end while */ /* 保存求出的每个叶结点的哈夫曼编码和编码的起始位 */ for (j=cd.start+1; j<n; j++) { HuffCode[i].bit[j] = cd.bit[j]; } HuffCode[i].start = cd.start; } /* end for */ /* 输出已保存好的所有存在编码的哈夫曼编码 */ for (i=0; i<n; i++) { printf ("%c 's Huffman code is: ", sym[i]); for (j=HuffCode[i].start+1; j < n; j++) { printf ("%d", HuffCode[i].bit[j]); } printf ("\n"); } system("pause"); return 0; }