當前位置:編程學習大全網 - 源碼下載 - 傳真解碼源代碼

傳真解碼源代碼

# include & ltstdio.h & gt

# 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);

}

  • 上一篇:PSP能玩的魔塔
  • 下一篇:貴州鎮遠旅遊指南貴州鎮遠旅遊景點
  • copyright 2024編程學習大全網