码迷,mamicode.com
首页 > 编程语言 > 详细

哈夫曼编码译码系统(c/c++)

时间:2019-06-03 21:57:24      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:二叉树   col   oid   文件   bsp   names   span   树节点   根据   

哈夫曼编码译码系统的实现,主要包含三部分:

1、创建哈夫曼树

2、编码函数

3、译码函数

编写代码时为了方便,在这里混用了c++的输入输出流。主体用c语言实现。

下面时代码部分:

1、头文件,以及储存结构:

#include<stdio.h>
#include<iostream>
using namespace std;
#define MAX 2000
typedef char ElemType;
typedef struct{
ElemType data;
int w;
int parent,lchild,rchild;
}HFMTNode;

2、哈夫曼树的创建,Ht储存全部节点的权值,n代表叶子节点数量。

void menu(HFMTNode Ht [],int n);//原型声明 
void CreatHFMTree(HFMTNode Ht[],int n)//创建哈夫曼树 
{
    int i,j,k,lmin,rmin;
    int min1,min2,m1;
    for(i=1;i<2*n;i++)
    {
        Ht[i].parent=Ht[i].lchild=Ht[i].rchild=-1;
    }
    for(i=n+1;i<2*n;i++)
    {
        min1=min2=MAX;
        lmin=rmin=-1;
        for(k=1;k<i;k++)
        {
            if(Ht[k].parent==-1)//只在尚未构造的二叉树节点中运行 
            {
                if(Ht[k].w<min1)
                {
                    min2=min1;
                    rmin=lmin;
                    min1=Ht[k].w;
                    lmin=k;
                }
                else
                 {
                    if(Ht[k].w<min2)
                    {
                        min2=Ht[k].w;
                        rmin=k;
                    }
                }
            }
            else{ 
                if(Ht[k].w<min2&&k>m1)//与创建好的二叉树节点比较,选取w小的一个 
                {
                    min2=Ht[k].w;
                    rmin=k;
                    m1=k;
                }
            }
        }
        Ht[lmin].parent=i;//对选择出的结点进行连接 
        Ht[rmin].parent=i;
        Ht[i].w=Ht[lmin].w+Ht[rmin].w;
        Ht[i].lchild=lmin;
        Ht[i].rchild=rmin;
    }
    printf("HFMTree have been created\n");
 } 

3、编码译码函数、主函数:

 void encoding(HFMTNode Ht [],int n)//编码 
 {
     int k;
     fflush(stdin);
     printf("Please input what you want to encode with the ending of‘#‘ :\n");
     char ch;
     ch=getchar();                      //读取字符 
     while (ch!=#)
     {
         for(k=1;k<=n;k++)
         {
             if(Ht[k].data==ch)
             {
                 break;
             }
         }                           //找到字符位置 
         HFMTNode temp1,temp=Ht[k];
         int flag=0;
         int a[n];
         while(temp.w!=Ht[2*n-1].w)
         {
             temp1=temp;
             temp=Ht[temp.parent];
             if(Ht[temp.lchild].w==temp1.w )
             {
                 a[flag]=0;
                 flag++;
             }
             else if(Ht[temp.rchild].w==temp1.w )
             {
                 a[flag]=1;
                 flag++;
             }
          }                               //用数组记录路径 
          for(int f=flag-1;f>=0;f--)
          {
              printf("%d",a[f]);
          }                                //编码输出 
         ch=getchar();
     }
     printf("\nencoding have finished\n");
    system("pause");
    system("cls");
    menu(Ht,n);
 }
 void decoding(HFMTNode Ht [],int n)//译码 
 {
     int k=2*n-1;
     fflush(stdin);
     printf("Please input what you want to decode with the ending of‘#‘ :\n");
     char ch;
     ch=getchar();                      //依次读取01字符 
     HFMTNode temp=Ht[2*n-1];
     while (ch!=#)
    {
        if(ch==1)
        {
            if(temp.rchild==-1)
            {
                printf("%c",temp.data);           //根据01向左右寻找,到达叶子节点时输出 
                temp=Ht[2*n-1];
                continue;
            }
            else
            {
                temp=Ht[temp.rchild ];
                ch=getchar();
            }
        }
        else if(ch==0)
        {
            if(temp.lchild==-1)
            {
                printf("%c",temp.data);
                temp=Ht[2*n-1];
                continue;
            }
            else
            {
                temp=Ht[temp.lchild ];
                ch=getchar();
            }
        }
    }
    printf("%c",temp.data);                    //输出要译码的最后一个字符 
    printf("\ndecoding have finished\n");
    system("pause");
    system("cls");
    menu(Ht,n);
 }
 void menu(HFMTNode Ht [],int n)
 {
     int j;
     printf("Input your choice:\n");
     printf("1.encoding      2.decoding      0.exit\n");
     cin>>j;
     switch (j)
     {
         case 1:encoding(Ht,n);break;
         case 2:decoding(Ht,n);break;
         case 0:break;
     } 
 }
 int main()
 {
     printf("Please input the amount of the node:\n");
     int i;
     scanf("%d",&i);
     HFMTNode Ht[2*i];//储存各个节点的数据 
     for(int k=1;k<=i;k++)
     {
         printf("Ht[%d]:Please input data :",k);
         cin>>Ht[k].data;
         printf("Ht[%d]:Please input w :",k);
         cin>>Ht[k].w;
     }
     CreatHFMTree(Ht,i);
     menu(Ht,i);
     return 0;
 }

       上面代码放在一起即可直接运行,本人水平有限,如有错误,欢迎大神指正。

哈夫曼编码译码系统(c/c++)

标签:二叉树   col   oid   文件   bsp   names   span   树节点   根据   

原文地址:https://www.cnblogs.com/a1969503125/p/10970017.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!