Ejemplo n.º 1
0
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();
}
Ejemplo n.º 2
0
/* 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);
}
Ejemplo n.º 3
0
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");
  } 
}
Ejemplo n.º 4
0
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;
}