国产在线精品一级A片-国产另类欧美-国产精品va在线观看一-我要找美国一级片黄色|www.zheinei.com

Huffman編碼完整代碼-huffman編碼c語言

時間:2017-05-05 14:04:30 C語言答案 我要投稿

Huffman編碼完整代碼-huffman編碼c語言

  huffman編碼是一種可變長編碼方式,于1952年由huffman提出。依據字符在需要編碼文件中出現的概率提供對字符的唯一編碼,并且保證了可變編碼的平均編碼最短,被稱為最優二叉樹,有時又稱為最佳編碼。以下是由陽光網小編整理關于Huffman編碼完整代碼的內容,希望大家喜歡!

  Huffman編碼完整代碼

  //利用哈夫曼樹進行編碼,

  #include <dos.h>

  #include <conio.h>

  #include <stdio.h>

  #include <stdlib.h>

  #include <string.h>

  #include<iostream>

  #include<malloc.h>

  using namespace std;

  typedef struct //定義哈夫曼樹

  { int weight; //結點權值

  int parent,lchild,rchild; //結點的父指針,左右孩子指針

  }HTNode,*HuffmanTree;

  typedef char **HuffmanCode; //數組存儲哈夫曼編碼表

  void CreateHuffmanTree(HuffmanTree &,unsigned int*,int ); //生成哈夫曼樹

  void HuffmanCoding(HuffmanTree,HuffmanCode &,int ); //哈夫曼樹編碼

  void PrintHuffmanCode(HuffmanCode,unsigned int*,int); //顯示編碼結果

  void Select(HuffmanTree,int,int&,int&); //在數組中尋找權值最小的兩個結點

  void main()

  {HuffmanTree HT; //哈夫曼樹HT

  HuffmanCode HC; //哈夫曼編碼表HC

  int n,i; //n是哈夫曼樹葉子結點數

  unsigned int *w; //w存放葉子結點權值

  cout<<"huffman編碼使用說明"<<endl ; //使用說明

  cout<<"例如:輸入需要進行編碼的字符數目2"<<endl;

  cout<<"然后輸入每個字符的權值(整數)"<<endl;

  cout<<"例如:5 29 "<<endl;

  cout<<"則構造一棵哈夫曼樹,哈夫曼編碼如下"<<endl;

  cout<<" 5---0"<<endl<< "29---1"<<endl;

  printf("請需要進行編碼的字符數目:");

  scanf("%d",&n);

  w=(unsigned int*)malloc(n*sizeof(unsigned int));

  printf("輸入每個字符的權值(整數):\n");

  for(i=0;i<n;i++) scanf("%d",&w[i]); //輸入各字符出現的次數/權值

  CreateHuffmanTree(HT,w,n); //生成哈夫曼樹

  HuffmanCoding(HT,HC,n); //進行編碼

  PrintHuffmanCode(HC,w,n); //顯示編碼

  }

  void CreateHuffmanTree(HuffmanTree &HT,unsigned int *w,int n)

  {//構造哈夫曼樹

  int i,m;

  int s1,s2;

  HuffmanTree p;

  if(n<=1) return;

  m=2*n-1; //n個葉子結點,共需2*n-1個結點

  HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); //開辟空間

  for(p=HT+1,i=1;i<=n;++i,++p,++w) //初始化

  {p->weight=*w;

  p->parent=0;

  p->lchild=0;

  p->rchild=0;

  }

  for(;i<=m;++i,++p)

  {p->weight=0;

  p->parent=0;

  p->lchild=0;

  p->rchild=0;

  }

  for(i=n+1;i<=m;++i) //建哈夫曼樹

  {Select(HT,i-1,s1,s2);

  HT[s1].parent=i; HT[s2].parent=i; //修改s1和s2結點的父指針parent

  HT[i].lchild=s1; HT[i].rchild=s2; //修改i結點的.左右孩子指針

  HT[i].weight=HT[s1].weight+HT[s2].weight; //修改權值指向在數組中的位置

  }

  }

  void HuffmanCoding(HuffmanTree HT,HuffmanCode &HC,int n)

  {//將哈夫曼樹進行編碼,所編的碼存放在HC,從葉子到根逆向求每個葉子結點的哈夫曼編碼

  int i,c,f,start;

  char *cd;

  HC=(HuffmanCode)malloc((n+1)*sizeof(char *)); //分配n個編碼的頭指針向量

  cd=(char *)malloc(n*sizeof(char)); //開辟一個求編碼的工作空間

  cd[n-1]='\0'; //編碼結束符

  for(i=1;i<=n;++i) //逐個地求哈夫曼編碼

  {start=n-1; //編碼結束位置

  for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent) //從葉子到根逆向求編碼

  if(HT[f].lchild==c) cd[--start]='0'; //

  else cd[--start]='1'; //若是右孩子編為'1'

  HC[i]=(char *)malloc((n-start)*sizeof(char)); //為第i個編碼分配空間

  strcpy(HC[i],&cd[start]); //將編碼從cd復制到HC中

  }

  free(cd);

  }

  void PrintHuffmanCode(HuffmanCode HC,unsigned int *w,int n)

  {//顯示輸入的n個葉子結點的哈夫曼樹的編碼表

  int i;

  printf("HuffmanCode is :\n");

  for(i=1;i<=n;i++)

  {printf(" %3d---",w[i-1]);

  puts(HC[i]);

  }

  printf("\n");

  }

  //在HT[1...t]中選擇parent不為0且權值最小的兩個結點,其序號分別為s1和s2

  void Select(HuffmanTree HT,int t,int&s1,int&s2)

  { int i,m,n;

  m=n=10000;

  for(i=1;i<=t;i++)

  {if(HT[i].parent==0&&(HT[i].weight<m||HT[i].weight<n))

  if(m<n)

  {n=HT[i].weight;s2=i;}

  else {m=HT[i].weight;s1=i;}

  }

  if(s1>s2) //s1放較小的序號

  {i=s1;s1=s2;s2=i;}

  }

  Huffman代碼流程


看過“Huffman編碼完整代碼”的人還看了:

1.課后答案免費下載合集

2.神秘國度愛情故事完整代碼(C語言)

【Huffman編碼完整代碼-huffman編碼c語言】相關文章:

1.信息論與編碼(陳運著)課后答案下載

2.編碼技巧在統計學教學中的運用論文

3.信息論與編碼(傅祖蕓著)課后答案下載

4.信息論與編碼理論(王育民著)課后答案下載

5.信息論與糾錯編碼(孫麗華著)課后答案下載

6.差錯控制編碼第2版(林舒著著)課后答案下載

7.c語言編程實習心得

8.c語言實習心得