| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2484 人关注过本帖
标题:求教这个程序测试时说断点异常
只看楼主 加入收藏
qq826647235
Rank: 2
等 级:论坛游民
帖 子:37
专家分:10
注 册:2016-5-4
结帖率:63.64%
收藏
已结贴  问题点数:20 回复次数:11 
求教这个程序测试时说断点异常
求教这个程序测试时说断点异常,哈夫曼编码的题

问题描述描述:


写一个哈夫曼码的编/译码系统,要求能对要传输的报文进行编码和解码。构造哈夫曼树时,权值小的放左子树,权值大的放右子树,编码时右子树编码为1,左子树编码为0.
 


输入:


输入表示字符集大小为n(n <= 100)的正整数,以及n个字符和n个权值(正整数,值越大表示该字符出现的概率越大);
输入串长小于或等于100的目标报文。


输出:


经过编码后的二进制码,占一行;
以及对应解码后的报文,占一行;
最后输出一个回车符。


输入样例:

5 a b c d e 12 40 15 8 25
bbbaddeccbbb




输出样例:

00011111110111010110110000
bbbaddeccbbb


代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Halv
{
    char data;
    int number;
    int mima;
    struct Halv *lchild;
    struct Halv *rchild;
}Bit,*Node;


void solve(Node gen,int m,int n)
{
    gen->mima=10*m+n;
     if(gen->lchild!=NULL)
    {
        solve(gen->lchild,gen->mima,0);
    }

     if(gen->rchild!=NULL)
        solve(gen->rchild,gen->mima,1);
}

void print(Node gen,char a)
{
     int judge=0;
     if(gen->data==a)
     {
         printf("%d",gen->mima);
         judge=1;
     }
     if(gen->lchild!=NULL&&judge!=1)
        print(gen->lchild,a);
     if(gen->rchild!=NULL&&judge!=1)
        print(gen->rchild,a);
}

int main()
{
    char A[100];
    int a,b,c,n,min1,min2;
    Node group[100],p1;
    scanf("%d",&n);
    for(a=0;a<n;a++)
    {
        group[a]=(Node)malloc(sizeof(Bit));
    }
    for(a=0;a<n;a++)
    {
        scanf(" %c",&group[a]->data);
    }
    for(a=0;a<n;a++)
    {
        scanf("%d",&group[a]->number);
        group[a]->lchild=NULL;
        group[a]->rchild=NULL;
    }
    for(a=0;a<n-1;a++)
    {
        for(b=0,c=10000;b<n;b++)
        {
            if(group[b]->number<c)
            {
                min1=b;
                c=group[b]->number;
            }
        }
        for(b=0,c=10000;b<n;b++)
        {
            if(group[b]->number<c&&group[b]->number>group[min1]->number)
            {
                min2=b;
                c=group[b]->number;
            }
        }
        p1=(Node)malloc(sizeof(Bit));
        {
            p1->lchild=group[min1];
            p1->rchild=group[min2];
            p1->number=group[min1]->number+group[min2]->number;
            p1->data='~';
        }
        group[min1]=p1;
        group[min2]->number=10000;
    }
    solve(p1,0,0);
    scanf("%s",A);
    b=strlen(A);
    printf("%d\n",b);
    for(a=0;a<b;a++)
    {
        print(p1,A[a]);
    }
    printf("\n");
    puts(A);
    return 0;
}


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

搜索更多相关主题的帖子: 二进制 正整数 断点 
2016-05-04 22:24
未来大仙
Rank: 6Rank: 6
来 自:黑窟窿
等 级:侠之大者
威 望:4
帖 子:263
专家分:491
注 册:2015-6-20
收藏
得分:20 
你能不能先说下,你这个是想干什么的?

好好学习,天天向上!
2016-05-04 22:30
qq826647235
Rank: 2
等 级:论坛游民
帖 子:37
专家分:10
注 册:2016-5-4
收藏
得分:0 
回复 2楼 未来大仙
描述:


写一个哈夫曼码的编/译码系统,要求能对要传输的报文进行编码和解码。构造哈夫曼树时,权值小的放左子树,权值大的放右子树,编码时右子树编码为1,左子树编码为0.
 


输入:


输入表示字符集大小为n(n <= 100)的正整数,以及n个字符和n个权值(正整数,值越大表示该字符出现的概率越大);
输入串长小于或等于100的目标报文。


输出:


经过编码后的二进制码,占一行;
以及对应解码后的报文,占一行;
最后输出一个回车符。


输入样例:

5 a b c d e 12 40 15 8 25
bbbaddeccbbb




输出样例:

00011111110111010110110000
bbbaddeccbbb

2016-05-04 22:31
qq826647235
Rank: 2
等 级:论坛游民
帖 子:37
专家分:10
注 册:2016-5-4
收藏
得分:0 
回复 2楼 未来大仙
问题就是这样的 = =
2016-05-04 22:31
未来大仙
Rank: 6Rank: 6
来 自:黑窟窿
等 级:侠之大者
威 望:4
帖 子:263
专家分:491
注 册:2015-6-20
收藏
得分:0 
回复 4楼 qq826647235
嗯,我看到了,问题不是很复杂,只是这个编码是什么意思?

好好学习,天天向上!
2016-05-04 22:41
qq826647235
Rank: 2
等 级:论坛游民
帖 子:37
专家分:10
注 册:2016-5-4
收藏
得分:0 
回复 5楼 未来大仙
额。。就是哈夫曼编码。。这个不好说。。
2016-05-04 22:47
未来大仙
Rank: 6Rank: 6
来 自:黑窟窿
等 级:侠之大者
威 望:4
帖 子:263
专家分:491
注 册:2015-6-20
收藏
得分:0 
我不知道你的问题是什么,就我看到的,我一条条看过去,直到我看到main函数里面的第四个循环处,嵌套循环里面的第一个for,c已经是树当中最小的那个number了,所以在第二个for,就不会执行if的语句,所以,min2是系统值,已经出现了越界。所以后面的我就没再看下去了。

好好学习,天天向上!
2016-05-04 23:04
qq826647235
Rank: 2
等 级:论坛游民
帖 子:37
专家分:10
注 册:2016-5-4
收藏
得分:0 
回复 7楼 未来大仙
我重新定义c=10000了。
2016-05-04 23:13
未来大仙
Rank: 6Rank: 6
来 自:黑窟窿
等 级:侠之大者
威 望:4
帖 子:263
专家分:491
注 册:2015-6-20
收藏
得分:0 
回复 8楼 qq826647235
噢,不好意思,我忽略了,不过这样的话,你后面的那句 c=.. 就没意义了,每次循环结束都会重新赋值c

好好学习,天天向上!
2016-05-04 23:28
未来大仙
Rank: 6Rank: 6
来 自:黑窟窿
等 级:侠之大者
威 望:4
帖 子:263
专家分:491
注 册:2015-6-20
收藏
得分:0 
min1 存的 是  最后一个 比10000小的数值的位置,可能不是最小的, 可能出现 在min1之前所有 的值都比 min1所在的值还要小,那么min2就可能不会被赋值。
还有你的代码,我编译了一遍,没有出现编译错误,再试了一次样例输入,也没有出现别的错误, 所以可能,唯一有瑕疵的就是这个问题了。

好好学习,天天向上!
2016-05-04 23:51
快速回复:求教这个程序测试时说断点异常
数据加载中...
 
   



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

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