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;
    }
  • 相关阅读:
    C#对HTTP数据还原
    Nancy.Host的Web应用
    Deep Learning
    业务规则引擎扩展模块
    LB 负载均衡的层次结构(转)
    主要的核心思想是取cookie然后发查询请求,不需要浏览器做代理(转)
    关于java mail 发邮件的问题总结(转)
    使用ping钥匙临时开启SSH:22端口,实现远程安全SSH登录管理就这么简单(转)
    利用Javamail接收QQ邮箱和Gmail邮箱(转)
    android ListView隐藏FooterView(headerView)
  • 原文地址:https://www.cnblogs.com/wuyibb/p/6994664.html
Copyright © 2011-2022 走看看