Huffman编码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stack>
using namespace std;
typedef struct node{             //哈夫曼树
 int weight;
 char data;
 int parent, lchild, rchild;
}HTree, *pHTree;

typedef struct n{
 char bit[10];
}HCode, *pHCode;


void Select(pHTree HT, int n, int *s1, int *s2)
{
 int i;
 for (i = 0; i < n && HT[i].parent!=-1; i++);
 *s1 = i;

 for (i = 0; i < n; i++)
  if (HT[i].weight < HT[*s1].weight && HT[i].parent == -1)
   *s1 = i;

 for (i = 0; i < n; i++)
  if (HT[i].parent == -1 && *s1 != i)
   break;
 *s2 = i;

 for (i = 0; i < n; i++)
  if (HT[i].parent == -1 && *s1 != i && HT[i].weight<HT[*s2].weight)
   *s2 = i;
 
 
}
void Creat(pHTree &HT,pHCode &HC,int n)
{
 int i;
 int m = 2 * n - 1;
 int s1=0, s2=1;
 HT = (pHTree)malloc((m)*sizeof(HTree));        //数据内存空间

 for (i = 0; i < m; i++)         //初始化哈夫曼树组
 {
  HT[i].weight = -1;
  HT[i].data = '#';
  HT[i].parent = -1;
  HT[i].lchild = -1;
  HT[i].rchild = -1;
 }
 fflush(stdin);

 printf("输入%d个数据: ", n);         //输入数据
 for (i = 0; i < n; i++){
  scanf("%c", &HT[i].data);
  getchar();
 }

 printf("输入数据的权: ");           //输入权重
 for (i = 0; i < n; i++)
 {
  scanf("%d", &HT[i].weight);
  getchar();
 }

 for (i = n; i < m; i++)              //循环创建哈夫曼树
 {
  Select(HT, i, &s1, &s2);
  HT[s1].parent = i;
  HT[s2].parent = i;
  HT[i].lchild = s1;
  HT[i].rchild = s2;
  HT[i].weight = HT[s1].weight + HT[s2].weight;
 }

}
void Code(pHTree &HT, pHCode &HC, int n)
{
 stack<char>s;

 HC = (pHCode)malloc(n*sizeof(HCode));
 int p,j=0,k=0,c=0;
 int i;
 for (i = 0; i < n; i++)
 {
  for (k = i, p = HT[k].parent;p!=-1; k=p,p = HT[p].parent)
  {
   if (k == HT[p].lchild)
    s.push('0');
   else
    s.push('1');
  }
 
  while (!s.empty())
  {
   HC[i].bit[j] = s.top();
   s.pop();
   j++;
  }
  HC[i].bit[j] = '';
  j = 0;
 }
 
}
int main()
{
 int num;
 pHTree  HT=NULL;
 pHCode HC=NULL;
 FILE *fp;
 printf("Please input num:");
 scanf("%d", &num);

 Creat(HT, HC, num);

 Code(HT, HC, num);
    fp=fopen("D:\2.txt","a");
 for (int i = 0; i < num; i++)
 {
    fputc(HT[i].data,fp);
        fprintf(fp,"%s ",HC[i].bit);
  printf("%c-----%s ", HT[i].data,HC[i].bit);
 }
 
 
 system("pause");
 return 0;
}

原文地址:https://www.cnblogs.com/da-peng/p/4975612.html