zoukankan      html  css  js  c++  java
  • 数据结构实验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;
    }
  • 相关阅读:
    spawn-fcgi
    JSP EL表达式
    关于订阅号和自定义菜单的关系问题
    微信公众平台开发(74) 用户分组管理
    微信公众平台开发(73) 客服接口发送客服消息
    用数据分析寻找下一位苍井空
    微商城
    微信支付体验
    微信公众平台开发(72)第三方接口
    微信公众平台开发(71)OAuth2.0网页授权
  • 原文地址:https://www.cnblogs.com/wuyibb/p/6994664.html
Copyright © 2011-2022 走看看