[C++] 纯文本查看 复制代码
// 哈夫曼编码.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <iostream>

using namespace std;

typedef struct{
        unsigned int weight;
        unsigned int parent,lchild,rchild;
}HTNode, * HuffmanTree;

typedef char * * HuffmanCode;

int min(HuffmanTree t,int i)
{
   int j,flag;
   unsigned int k = 100000;
   for(j=1;j<=i;j++)
      if(t[j].weight<k&&t[j].parent==0)
                        k = t[j].weight,flag = j;
   t[flag].parent = 1;
   return flag;
}

void select(HuffmanTree t,int i, int *s1, int *s2)//在HT[1..i-1]选择parent为0且weight最小的两个结点,其序号分别为s1和s2.
{
        int temp;
        *s1 = min(t,i);   
        *s2 = min(t,i);
        if(*s1>*s2)   
        {
                temp = *s1;
                *s1 = *s2;
                *s2 = temp;
        }
}

void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n)
{
        int i,s1,s2,start;
        HuffmanTree p;
        if( n<=1 )
                return;
        int m = 2*n - 1;//n个叶子结点的赫夫曼树共有2n-1个结点(保证是正则二叉树)
        HT = (HuffmanTree) malloc( (m+1)*sizeof(HTNode) );//0号单元未用
        for( p = HT+1,i=1;i <= n;++i,++p,++w)//初始化各节点
    {
                (*p).weight=*w;(*p).parent=0;(*p).lchild=0;(*p).rchild=0;
    }
        for(;i<=m;++i,++p)
        {
                (*p).weight=0;(*p).parent=0;(*p).lchild=0;(*p).rchild=0;
        }
    for(i=n+1;i<=m;++i)
        {
                select(HT,i-1,&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;
        }
        HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
        char *cd;
        cd=(char*)malloc(n*sizeof(char));
        cd[n-1]='\0';
        int c,f;
        for(i=1;i<=n;++i)
        {
                start=n-1;
                for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
                        if(HT[f].lchild==c)
                                cd[--start]='0';
                else
                        cd[--start]='1';
                HC[i]=(char*)malloc((n-start)*start*sizeof(char));
                strcpy(HC[i],&cd[start]);
        }
free(cd);
}        

int main()
{
        int w[100];
        HuffmanTree ht;
    HuffmanCode hc;
        int n;
        cout<<"请输入需编码个数"<<endl;
        cin>>n;
        cout<<"请输入权值";
        for (int i=0;i<n;i++)
        {
                cin>>w[i];
        }
        HuffmanCoding(ht,hc,w,n);
        for (int i=1;i<=n;i++)
        {
                printf("%d的赫夫曼编码:%s\n",ht[i].weight,hc[i]);
        }
    system("pause");
}

共收到 10 条回复
seleveny · #2 · 2012-8-20 06:32:04  回复 支持 反对
68 69 70 行是HT<i> ?

点评

我程序里是[]不知道为啥拷贝过来就成了 应该是代码显示的问题  详情 回复 发表于 2012-8-20 08:40
simon3322 · #3 · 2012-8-20 08:40:10  回复 支持 反对
seleveny 发表于 2012-8-20 06:32
68 69 70 行是HT ?

我程序里是[]不知道为啥拷贝过来就成了<>

应该是代码显示的问题
xywhere · #4 · 2013-8-13 19:37:17  回复
好。。、

点评

vo_
这是在挖数据结构的节奏啊~~~~我也跟来瞅瞅  详情 回复 发表于 2013-8-13 20:06
vo_
这是在挖数据结构的节奏啊~~~~我也跟来瞅瞅  详情 回复 发表于 2013-8-13 20:06
vo_ · #5 · 2013-8-13 20:06:07  回复 支持 反对

这是在挖数据结构的节奏啊~~~~我也跟来瞅瞅

点评

必须的啊 这都被你发现了。。很隐秘的  详情 回复 发表于 2013-8-13 20:25
vo_ · #6 · 2013-8-13 20:06:08  回复 支持 反对

这是在挖数据结构的节奏啊~~~~我也跟来瞅瞅

点评

。。。。。  详情 回复 发表于 2013-8-13 20:25
xywhere · #7 · 2013-8-13 20:25:50  回复 支持 反对
vo_ 发表于 2013-8-13 20:06
这是在挖数据结构的节奏啊~~~~我也跟来瞅瞅

必须的啊 这都被你发现了。。很隐秘的

点评

vo_
你挖掘~~我跟踪哈哈  详情 回复 发表于 2013-8-13 21:36
xywhere · #8 · 2013-8-13 20:25:59  回复 支持 反对
vo_ 发表于 2013-8-13 20:06
这是在挖数据结构的节奏啊~~~~我也跟来瞅瞅

。。。。。
vo_ · #9 · 2013-8-13 21:36:55  回复 支持 反对
xywhere 发表于 2013-8-13 20:25
必须的啊 这都被你发现了。。很隐秘的

你挖掘~~我跟踪哈哈

点评

最新的 帖子 。。快去跟踪  详情 回复 发表于 2013-8-13 21:40
xywhere · #10 · 2013-8-13 21:40:36  回复 支持 反对
vo_ 发表于 2013-8-13 21:36
你挖掘~~我跟踪哈哈

最新的 帖子 。。快去跟踪
chrispan · #11 · 2013-8-20 01:02:01  回复 支持 反对
感谢学长,nice
回帖
B Color Image Link Quote Code Smilies
Command + Enter
快速回复 返回顶部 返回列表