哈夫曼編碼的實現

2021-09-01 18:35:55 字數 1953 閱讀 4003

// question.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。

//#include "stdio.h"

#include "stdlib.h"

#define stringsize 30//輸入最大字串的大小

struct bitreenode//構造二叉樹結構體

;struct codestack//順序棧用來存哈弗曼編碼

;void push(codestack *&code, int path)//入棧,存入哈夫曼**,path為哈弗曼編碼值

void huffmancode(bitreenode *p, codestack *code)//p為每乙個節點,code是乙個棧,用來存哈弗曼編碼

if (p->sign != '#')//讀到了葉子結點

putchar('\n');//換行準備輸出下一組哈弗曼編碼

} huffmancode(p->l, code);//左子樹深度搜尋

code->top = p->path;//這裡為訪問頭結點的位置,當做再次訪問此結點。

//將top重置為當前層數(path儲存的當前層數)

huffmancode(p->r, code);//右子樹遞迴 }}

void renewarray(char a, int address)//刪除相同字元,重新生成字串

a[address] = '\0';//最後一項為空,使得size減小1

}void sortarray(bitreenode *data, int k)//哈夫曼陣列根據權值大小排序

}void deletearray(bitreenode *data, int* boundary)//刪除陣列中最小的兩個元素

*boundary = i - 2;//實際上多了乙個,用來存放新構成的樹

}void initiatestack(codestack *&code)//初始化棧

void countpower(char store, bitreenode *data, int* boundary)//統計字串中各字元的權值

//data為最終要獲取的原始陣列

else//如果不相等便搜尋下乙個位置

i++;

} data[k]->sign = flag;

data[k]->power = j;

k++;//指向哈夫曼陣列的下乙個單元

j = 0;//權值歸零用來統計下乙個字元的權值

} *boundary = k;

}void initiatestruct(bitreenode *data)//初始化哈夫曼原始陣列

}void initiatetree(bitreenode *data, bitreenode **s, int* boundary)

else

(*s)->power = data[0]->power + data[1]->power;//頭結點的權值是兩個子樹權值之和

(*s)->sign = '#';//頭結點的符號為「#」

(*s)->path = -1;//根結點的路徑預設為-1

deletearray(data, boundary);//刪除陣列中最小的兩個元素

data[*boundary] = (*s);//陣列末尾存放新生成的樹

if (*boundary < 0)//如果只剩下一棵樹就不用排序

break;

else

sortarray(data, *boundary + 1);//哈夫曼陣列根據權值大小排序 }}

void operatemode(char store, bitreenode *data, int *boundary)

case 2:

*boundary = i;

system("cls");

break;

} }}void main()

哈夫曼編碼實現

define huffmancode char typedef struct node huffmantree struct node 葉節點為n的哈夫曼樹有2 n 1個節點 用 1表示當前parent未被訪問 huffmantree createhuffmantree int wet,int n ...

實現哈夫曼編碼

include include include include include using namespace std typedef struct node vector nodes 表示結點的指標組 double char number 0 每個字元平均花費的編碼長度 const int cha...

哈夫曼編碼 哈夫曼樹

1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....