zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    ip地址和子网掩码
    Mysql 进阶查询 (select 语句的高级用法)
    MHA高可用配置及故障切换
    数据库的备份与恢复需要修改
    每天一分钟,了解mysql索引,事务与存储引擎
    mysql基础命令详解
    带你走进mysql数据库
    Spring XML无自动提示
    Spring环境搭建错误
    读书笔记_java设计模式深入研究 第十一章 装饰器模式 Decorator
  • 原文地址:https://www.cnblogs.com/da-peng/p/4975612.html
Copyright © 2011-2022 走看看