從鍵盤接收一串電文字元,輸入對應的huffman編碼。同時,能翻譯由huffman編碼生成的**串,輸出對應的電文字串。
1) 構造一棵 huffman樹。
2) 實現huffman編碼,並用huffman編碼生成的**串進行解碼。
3) 程式中字元和權值是可變的,實現程式的靈活性。
參考文章:
#include
#include
#include
#define maxbit 100
#define maxvalue 10000
#define maxleaf 30
#define maxnode maxleaf*2 -1
typedef
struct
hcodetype; /* 編碼結構體 */
typedef
struct
hnodetype; /* 結點結構體 */
//構造乙個哈夫曼樹,n為葉子數
void createhuffmantree(hnodetype huffnode[maxnode],int n)
//給n個葉子結點賦權值
for(i=0;iprintf("請輸入第%d個葉子的權值:",i);
scanf("%d",&huffnode[i].weight);
}/*構建哈夫曼樹*/
for(i=0;i1;i++)
//m1取到最小值後,無論如何第乙個if都不會成立,此時elseif開始執行
else
if (huffnode[j].weight < m2 && huffnode[j].parent==-1)
}huffnode[x1].parent = n+i;
huffnode[x2].parent = n+i;
huffnode[n+i].weight = huffnode[x1].weight + huffnode[x2].weight;
huffnode[n+i].lchild = x1;
huffnode[n+i].rchild = x2;
printf ("x1.weight and x2.weight in round %d: %d, %d\n", i+1, huffnode[x1].weight, huffnode[x2].weight); /* 用於測試 */
printf ("\n");
}}/*解碼,string陣列是要破解的編碼;buf;n是葉子數*/
void decoding(char
string, hnodetype buf,int num)
i=0;
nump=&num[0];//nump指向編碼
while(nump<(&num[strlen(string)]))
else tmp=buf[tmp].rchild;
nump++;
}printf("%d",buf[tmp].value);
}}int main()
for(j=cd.start+1;j//因為在上面的while中,到了根結點後,start減了一下,故要+1
huffcode[i].bit[j]=cd.bit[j];//儲存編碼
huffcode[i].start=cd.start;//儲存每個編碼的起始位置
}/*輸出哈夫曼編碼*/
for(i=0;iprintf("第%d個葉子的哈夫曼編碼是:",i);
for(j=huffcode[i].start+1;jprintf("%d",huffcode[i].bit[j]);
}printf(" start:%d",huffcode[i].start);
printf("\n");
}printf("請輸入要破解的編碼:");
scanf("%s",&pp);
decoding(pp,huffnode,n);
getchar();
return
0;}
資料結構 哈夫曼樹 哈夫曼編碼
哈夫曼樹又稱最優樹 二叉樹 是一類帶權路徑最短的樹。構造這種樹的演算法最早是由哈夫曼 huffman 1952年提出,這種樹在資訊檢索中很有用。結點之間的路徑長度 從乙個結點到另乙個結點之間的分支數目。樹的路徑長度 從樹的根到樹中每乙個結點的路徑長度之和。結點的帶權路徑長度 從該結點到樹根之間的路徑...
哈夫曼編碼 哈夫曼樹 (資料結構)
哈夫曼編碼,又稱霍夫曼編碼,是一種編碼方式,哈夫曼編碼是可變字長編碼 vlc 的一種。huffman於1952年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做huffman編碼 有時也稱為霍夫曼編碼 include include inc...
資料結構 哈夫曼編碼
time limit 1000ms memory limit 65536kb submit statistic problem description 字元的編碼方式有多種,除了大家熟悉的ascii 編碼,哈夫曼編碼 huffman coding 也是一種編碼方式,它是可變字長編碼。該方法完全依據字...