# include & ltstdlib.h & gt
# include & ltstring.h & gt
typedef char * HuffmanCode/*動態分配數組並存儲霍夫曼代碼*/
typedef結構
{
無符號整數權重;/*用於存儲每個節點的權重*/
無符號int parent、LChild、RChild/*指向父節點和子節點的指針*/
}HTNode,* HuffmanTree/*動態分配數組並存儲霍夫曼樹*/
void select(HuffmanTree *ht,int n,int *s1,int *s2)
{
int I;
int min
for(I = 1;我& lt= n;i++)
{
if((*ht)[i]。parent == 0)
{
min = I;
I = n+1;
}
}
for(I = 1;我& lt= n;i++)
{
if((*ht)[i]。parent == 0)
{
if((*ht)[i]。重量& lt(* ht)[最小值]。重量)
min = I;
}
}
* s 1 = min;
for(I = 1;我& lt= n;i++)
{
if((*ht)[i]。parent = = 0 & amp& amp我!=(*s1))
{
min = I;
I = n+1;
}
}
for(I = 1;我& lt= n;i++)
{
if((*ht)[i]。parent = = 0 & amp& amp我!=(*s1))
{
if((*ht)[i]。重量& lt(* ht)[最小值]。重量)
min = I;
}
}
*s2 =最小值;
}
void CrtHuffmanTree(HuffmanTree * ht,int *w,int n)
{/* w存儲n個已知權重來構造霍夫曼樹ht */
int m,I;
int s1,S2;
m = 2 * n-1;
* ht =(HuffmanTree)malloc((m+1)* sizeof(ht node));/*未使用單元0 */
for(I = 1;我& lt= n;i++)
{/*1-n放葉節點,初始化*/
(*ht)[i]。重量= w[I];
(*ht)[i]。l child = 0;
(*ht)[i]。parent = 0;
(*ht)[i]。RChild = 0;
}
for(I = n+1;我& lt= m;i++)
{
(*ht)[i]。權重= 0;
(*ht)[i]。l child = 0;
(*ht)[i]。parent = 0;
(*ht)[i]。RChild = 0;
}/*非葉節點初始化*/
/* -初始化完成!對應的算法步驟1-*/
for(I = n+1;我& lt= m;I++) /*創建非葉節點並構建霍夫曼樹*/
{/*在(*ht)[1]~(*ht)[i-1]範圍內,選擇父節點為0且權重最小的兩個節點,將它們的序號賦給s1和s2返回*/
選擇(ht,i-1,& amps1。S2);
(*ht)[s1]。parent = I;
(*ht)[s2]。parent = I;
(*ht)[i]。l child = s 1;
(*ht)[i]。RChild = s2
(*ht)[i]。重量=(*ht)[s1]。重量+(*ht)[s2]。重量;
}
}/*霍夫曼樹建立*/
void output Huffman(Huffman tree HT,int m)
{
如果(m!=0)
{
printf("%d ",HT[m]。重量);
outputHuffman(HT,HT[m])。l child);
outputHuffman(HT,HT[m])。RChild);
}
}
void CrtHuffmanCode(HuffmanTree * ht,HuffmanCode *hc,int n)
/*從葉節點到根,反向求每個葉節點對應的霍夫曼碼*/
{
char * cd
int I;
無符號int c;
int start
int p;
HC =(Huffman code *)malloc((n+1)* sizeof(char *));/*分配n個編碼頭指針*/
CD =(char *)malloc(n * sizeof(char));/*為當前編碼分配工作空間*/
CD[n-1]= ' \ 0 ';/*從右到左逐位存儲代碼,先存儲代碼終止符*/
for(I = 1;我& lt= n;I++) /*求n個葉節點對應的霍夫曼碼*/
{
start = n-1;/*初始化編碼開始指針*/
for(c=i,p=(*ht)[i]。父母;p!=0;C=p,p=(*ht)[p]。parent) /*查找從葉子到根節點的代碼*/
if( (*ht)[p]。LChild == c)
CD[-start]= ' 0 ';/*左分支標簽0*/
其他
CD[-start]= ' 1 ';/*右支標誌1*/
HC[I]=(char *)malloc((n-start)* sizeof(char));/*為第I個代碼分配空間*/
strcpy(hc[i],& ampCD[start]);
}
免費(光盤);
for(I = 1;我& lt= n;i++)
Printf("%d代碼是%s\n ",(*ht)[i]。重量,HC[I]);
}
void main()
{
赫芬頓樹HT;
HuffmanCode HC
int * w;
int i,n;//元素的數量;
int魏;//元素的權重;
int m;
printf("輸入霍夫曼樹的總數:");
scanf("%d ",& ampn);
w =(int *)malloc((n+1)* sizeof(int));
for(I = 1;我& lt= n;i++)
{
printf("輸入%d元素的權重:",I);
fflush(stdin);
scanf("%d ",& amp魏);
w[I]=魏;
}
CrtHuffmanTree(& amp;HT,w,n);
m = 2 * n-1;
outputHuffman(HT,m);
printf(" \ n ");
CrtHuffmanCode。HT & amp;HC,n);
}