数据结构实验9

题目:根据哈夫曼(Huffman)编码的原理,编写一个程序,在用户输入节点权重的基础上建立它的哈夫曼编码。

test.h

#include<stdio.h>
#include<malloc.h>
#define Max 20
#define MaxValue 1000
typedef struct huffNode
{
    char ch;
    int weight;
    int lChild;
    int rChild;
    int parent;
    char hCode[Max];
}huffman;



void init(huffman *huffmanTree,int *w,char *z,int n)
{
    int i;
    //for(i=0;i<2*n-1;i++)
    //    huffmanTree[i]=(huffman *)malloc(sizeof(huffman));

    for(i=0;i<2*n-1;i++)
    {
        huffmanTree[i].ch=z[i];
        huffmanTree[i].weight=w[i];
        huffmanTree[i].parent=-1;
        huffmanTree[i].lChild=-1;
        huffmanTree[i].rChild=-1;
    }
}

void setHuffmanTree(huffman *huffmanTree,int n)
{
    int m,m1,m2,x1,x2,i,j;
    m=2*n-1;
    for(i=n;i<m;++i)
    {
        m1=m2=MaxValue;
        x1=x2=0;
        for(j=0;j<i;++j)
        {
            if(huffmanTree[j].parent==-1&&huffmanTree[j].weight<m1)
            {
                m2=m1;x2=x1;m1=huffmanTree[j].weight;x1=j;
            }
            else if (huffmanTree[j].parent==-1&&huffmanTree[j].weight<m2)
            {    m2=huffmanTree[j].weight;x2=j;
            }
        }
        huffmanTree[x1].parent=i;
        huffmanTree[x2].parent=i;
        huffmanTree[i].lChild=x1;
        huffmanTree[i].rChild=x2;
        huffmanTree[i].weight=m1+m2;
    }
}


void huffmanTreeCode(huffman *huffmanTree,int n)
{
    char hc[Max];
    int hcLen;
    int i,j,k,parent,p;
    for(i=0;i<n;i++)
    {
        hcLen=0;
        parent=huffmanTree[i].parent;//待编码字符的双亲结点下标
        p=i;
        while(parent!=-1)//未到达根结点
        {
            if(huffmanTree[parent].lChild==p)//是左孩子
                hc[hcLen]='0',hcLen++;
            else if(huffmanTree[parent].rChild==p)//是右孩子
                hc[hcLen]='1',hcLen++;
                p=parent;
                parent=huffmanTree[parent].parent;//继续向根结点查找
    }
    for(j=0,k=hcLen-1;j<hcLen;j++,k--)//将编码写入相应字符数组
        huffmanTree[i].hCode[j]=hc[k];
        huffmanTree[i].hCode[j]='';//加上字符串结束符
    }

    return;
}

test.c

#include"test.h"
#include <iostream.h>

int main()
{
    int n,i;

    char z,*Z;
    int w,W[Max];
    huffman huffmanTree[Max];
    
    printf("请输入叶子个数:
");
    scanf("%d",&n);
   //W=(int *)malloc(n*sizeof(int));
    Z=(char *)malloc(n*sizeof(char));
    printf("请输入%d个字符和权值。
",n);
    for(i=0;i<n;i++)
    {
        printf("请输入第%d个字符:
",i+1);
        //scanf("%c",&z);
        cin>>z;
        Z[i]=z;
        printf("请输入第%d个字符的权:
",i+1);
        //scanf("%d",&w);
        cin>>w;
        W[i]=w;
    }
    
    init(huffmanTree,W,Z,n);
    setHuffmanTree(huffmanTree,n);
    huffmanTreeCode(huffmanTree,n);
    for(i=0;i<n;i++)
    {
        printf("%c:%s
",huffmanTree[i].ch,huffmanTree[i].hCode);

    }
    return 0;
}
原文地址:https://www.cnblogs.com/wuyibb/p/6994664.html