快捷搜索:   服务器  安全  linux 安全  MYSQL  dedecms

数据结构:哈夫曼树的应用

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<conio.h>a
    #include<graphics.h>
    #define MAXVALUE 200           /*权值的最大值*/
    #define MAXB99v  30             /*最大的编码位数*/
    #define MAXNODE 30             /*初始的最大的结点数*/
     strUCt haffnode
             {char data;
       int weight;
                            int flag;
                            int parent;       /*双亲结点的下标*/
                            int leftchild;    /*左孩子下标*/
                            int rightchild;   /*右孩子下标*/
             };
     struct haffcode
             {int bit[MAXNODE];
                            int start;        /*编码的起始下标*/
       char data;
       int weight;       /*字符权值*/
             };


    /*函数说明*/
    /************************************************************************/
    void pprintf(struct haffcode haffcode[],int n);
    /*输出函数*/
    void haffmantree(int weight[],int n,struct haffnode hafftree[],char data[]);
    /*建立哈夫曼树*/
    void haffmancode(struct haffnode hafftree[],int n,struct haffcode haffcode[]);
    /*求哈夫曼编码*/
    void test(struct haffcode haffcode[],int n);
    /*测试函数*/
    void end();
    /*结束界面函数*/
    /************************************************************************/

    void haffmantree(int weight[],int n,struct haffnode hafftree[],char data[])
        /*建立叶结点个数为n,权值数组为weight[]的哈夫曼树*/
        {int i,j,m1,m2,x1,x2;
         /*哈夫曼树hafftree[]初始化,n个叶结点共有2n-1个结点*/
             for(i=0;i<2*n-1;i++)
            {if(i<n)  {hafftree[i].data=data[i];
         hafftree[i].weight=weight[i];   /*叶结点*/
               }
             else     {hafftree[i].weight=0;           /*非叶结点*/
         hafftree[i].data='\0';
         }
             hafftree[i].parent=0;                     /*初始化没有双亲结点*/
                                  hafftree[i].flag=0;
             hafftree[i].leftchild=-1;
                                  hafftree[i].rightchild=-1;
                                 }
       for(i=0;i<n-1;i++)                              /*构造哈夫曼树n-1个非叶结点*/
                                {m1=m2=MAXVALUE;
                                 x1=x2=0;
            for(j=0;j<n+i;j++)
         {if(hafftree[j].weight<m1&&hafftree[j].flag==0)
                                             {m2=m1;
                                              x2=x1;
                                              m1=hafftree[j].weight;
                                              x1=j;
                                             }
          else if(hafftree[j].weight<m2&&hafftree[j].flag==0)
                                                {m2=hafftree[j].weight;
                                                 x2=j;
                                                }
                                      }
                                      hafftree[x1].parent=n+i;
                                      hafftree[x2].parent=n+i;

顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论