• 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;
    }

  • 相关阅读:
    mysql批量插入数据的基类
    mount命令解析
    常用linux命令记录
    转载一篇大神的博客文章
    linux查看网卡状态
    centos7配置网卡绑定
    coentos7安装python3
    阿里云ecs 硬盘在线扩容
    centos7安装redis5
    centos7 rpm安装nginx
  • 原文地址:https://www.cnblogs.com/da-peng/p/4975612.html
Copyright © 2020-2023  润新知