main.cpp
- #include”HuffmanTree.h”
- int main()
- {
- HuffmanTree HT;
- int *w,i,n;
- unsigned int sum = 0;
- printf(”请输入测试的个数(>1): ”);
- scanf(”%d”,&n);
- w=(int *)malloc((n+1)*sizeof(int *));
- w[0]=0;
- printf(”Enter weight:\n”);
- for(i=1;i<=n;i++)
- {
- printf(”w[%d]= ”,i);
- scanf(” %d”,&w[i]);
- }
- sum= HuffmanCoding(HT,w,n);
- printf(”%d\n”,sum);
- system(”pause”);
- return 0;
- }
HuffmanTree.cpp
- #include”HuffmanTree.h”
- unsigned int HuffmanCoding(HuffmanTree &HT,int *w,int n)
- {
- unsigned int i,s1=0,s2=0,m;
- unsigned int sum=0;
- HuffmanTree p;
- MinCode min;
- if(n<=1) //输入个数少于1,则返回
- return 0;
- m=2*n-1; //总结点数
- HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); //申请的哈夫曼树的所占空间
- for(p=HT,i=0;i<=n;i++,p++,w++) //将n个结点 赋值权重,并初始化儿子结点
- {
- 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++) //对剩余结点,结合权重,进行建立哈夫曼树
- {
- min=Select(HT,i-1);//在前n个结点中挑选2个权重最小的结点。
- s1=min.s1;
- s2=min.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;//此时 父节点的权重为。
- sum +=HT[i].weight;
- }
- return sum;
- }
- MinCode Select(HuffmanTree &HT,unsigned int n)
- {
- unsigned int min,smin,temp=0,i;
- int s1,s2,temp2;
- MinCode node;
- for(i=1;i<=n;i++)//挑选出一个 父节点 为零的结点
- {
- if(HT[i].parent==0)
- {
- min=HT[i].weight;
- s1=i;
- break;
- }
- }
- temp=i++;
- for(;i<=n;i++) //挑选出的 s1与 其他的父节点为零的结点进行比较
- if ((HT[i].weight<min)&&HT[i].parent==0)
- {
- min=HT[i].weight;
- s1=i;
- }
- for(i=temp;i<=n;i++)//接着 挑选s2
- {
- if(HT[i].parent == 0 && i != s1)
- {
- smin=HT[i].weight;
- s2=i;
- break;
- }
- }
- for(i=1;i<=n;i++) //并与其他结点进行比较
- {
- if(HT[i].weight<smin&&i != s1&&HT[i].parent==0)
- {
- smin=HT[i].weight;
- s2=i;
- }
- }
- if(s1>s2){
- temp=s1;
- s1=s2;
- s2=temp;
- }
- node.s1=s1;
- node.s2=s2;
- return node;
- }
DS.h
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <math.h>
- #define TRUE 1
- #define FALSE 0
- #define OK 1
- #define ERROR 0
- typedef int Status;
HuffmanTree.h
- #include”DS.h”
- typedef struct
- {
- unsigned int weight;
- unsigned int parent, lchild, rchild;
- } HTNode, *HuffmanTree; //动态分配数组存储哈夫曼树
- typedef struct{
- unsigned int s1;
- unsigned int s2;
- }MinCode;
- typedef char * * HuffmanCode; //动态分配数组存储哈夫曼编码表
- unsigned int HuffmanCoding(HuffmanTree &HT,int *w,int n);
- //void Select(HuffmanTree HT,unsigned int n,int s1,int s2);
- MinCode Select(HuffmanTree &HT,unsigned int n);