| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1545 人关注过本帖
标题:赫夫曼树编码(编译没有错,运行到一半就崩了,麻烦大神帮忙看一下)
只看楼主 加入收藏
hsm
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2015-11-19
结帖率:66.67%
收藏
 问题点数:0 回复次数:3 
赫夫曼树编码(编译没有错,运行到一半就崩了,麻烦大神帮忙看一下)
我是用VS2010编的,主函数是这样的:
程序代码:
#include "stdafx.h"
#include"Huffman.h"


int _tmain(int argc, _TCHAR* argv[])
{
    int n,i;                       //n是赫夫曼树叶子结点数
    char flag = 'y';
    int* w;                        //存放权值
    char* c;                       //存放原始码
    Huffman HT;

    cout<<"------------------------本程序将演示赫夫曼树------------------------"<<endl<<endl;
    cout<<"是否继续?(输入Y or N)"<<endl;
    cin>>flag;
    while(flag == 'y'||flag == 'Y')
    {
        cout<<"请输入叶子结点数"<<endl;
        cin>>n;
        if(n>1)
        {
            w=new int[n];
            c=new char[n];
            cout<<"请输入原始码及权值"<<endl;
            for(i=0;i<n;i++){
                cin>>c[i];
                cin>>w[i];
            }

            HT.HuffmanCoding(w,n);
            cout<<endl;
            HT.PrintHuffmanCode(w,n);
            
            cout<<"赫夫曼树构造完毕,你还想继续吗?"<<endl;
            cin>>flag;
        }
        else{ 
            cout<<"叶子节点个数不能小于2"<<endl;
            cout<<"你还想继续吗?"<<endl;
            cin>>flag;
        }

    }

    delete []c;
    delete []w;

    return 0;
}


我在头文件"stdafx.h"中添加了:
程序代码:
#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>
#include <iostream>
using namespace std;
#include <string.h>

typedef char **HuffmanCode;

typedef struct{
    unsigned int  weight;
    int parent,lchild,rchild;
    char letter;
}HTNode;


// TODO: 在此处引用程序需要的其他头文件
#include"Huffman.h"

然后添加了一个类Huffman
头文件类定义:
程序代码:
#pragma once
class Huffman
{
public:
    HTNode *HT;
    HuffmanCode HC;

public:
    Huffman(void);
    ~Huffman(void);
    void HuffmanCoding(int *w,int n);
    void PrintHuffmanCode(int* w,int n);
    void Select(int t, int& s1, int& s2);

};

实现函数是这样的:
程序代码:
#include "StdAfx.h"
#include "Huffman.h"


Huffman::Huffman(void)
{
}


Huffman::~Huffman(void)
{
}


void Huffman::HuffmanCoding(int * w,int n){

    int m , i;
    m = 2 * n - 1;
    HT = new HTNode[m+1];
    HTNode *p = HT+1;

    for( 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;
    }

    int s1,s2;
    for(i=n+1;i<=m;++i){                                          //建赫夫曼树
        //在HT[1...i-1]选择parent 为0且weight最小的两个结点,其序号为s1和s2
        Select(i-1,s1,s2);
        HT[s1].parent = i;   HT[s2].parent = i;
        HT[s1].lchild = s1;  HT[s2].rchild = s2;
        HT[i].weight = HT[s1].weight + HT[s2].weight;
    }

    HC = new char* [n+1];                    //分配n个编码的头指针向量    
    char* cd = new char[n];                     //开辟一个求编码的工作空间
    cd[n-1] = '\0';                             //结束编码符
    int c,f,start;

    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';            //若是左孩子编为'0'
            else
                cd[--start] = '1';             //若是右孩子编为'1'
        HC[i] = new char[n-start];             //为第i个编码分配存储空间
        strcpy_s(HC[i],1,&cd[start]);              //将编码从cd复制到HC中           
    }
    delete []cd;                                //释放存储空间
}

void Huffman::PrintHuffmanCode(int* w,int n){
    //显示有n个叶子结点的赫夫曼树的编码表
    int i;
    cout<<"赫夫曼编码如下:"<<endl;
    cout<<"权值"<<'\t'<<"赫夫曼编码"<<endl;
    for(i=1;i<=n;i++)
        cout<<w[i-1]<<'\t'<<HC[i];
    cout<<endl;
}

void Huffman::Select( int t, int& s1, int& s2){
    int i,j,k,least,second;
    for(i = 1;i <=t ;i++)
        if(HT[i].parent == 0)
            break;
    for(j=i+1;j<=t;j++)
        if(HT[j].parent == 0)
            break;
    if(HT[i].weight < HT[j].weight){
        least = i;
        second = j;
    }
    else
    {
        least = j;
        second = i;
    }
    for(k=j+1;k<=t;k++)
        if(HT[k].parent == 0)
            if(HT[k].weight < HT[least].weight)
            {
                second = least;
                least = k;
            }
            else if (HT[k].weight >= HT[least].weight && HT[k].weight < HT[second].weight)
                second=k;

    s1=least;
    s2=second;
}



编译没有错,但是每次运行把需要输入的原始码和权值输入完了,就不可以运行了,不知道哪里写着有问题,麻烦帮忙看一下,谢谢

[此贴子已经被作者于2016-5-22 22:45编辑过]

搜索更多相关主题的帖子: color 
2016-05-22 22:39
hsm
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2015-11-19
收藏
得分:0 
把这么长的代码贴出来是希望方便大家运行多了一点不好意思啊
2016-05-22 22:44
hsm
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2015-11-19
收藏
得分:0 
先谢谢各位~\(≧▽≦)/~啦啦啦

[此贴子已经被作者于2016-5-22 22:46编辑过]

2016-05-22 22:45
hsm
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2015-11-19
收藏
得分:0 
找到错啦
2016-05-23 22:02
快速回复:赫夫曼树编码(编译没有错,运行到一半就崩了,麻烦大神帮忙看一下)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021450 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved