标题:求哈夫曼编码时程序运行到一半就终止了,编译无错
只看楼主
Finalwinner
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2016-3-27
结帖率:100%
已结贴  问题点数:20 回复次数:8 
求哈夫曼编码时程序运行到一半就终止了,编译无错
这是一个求哈夫曼树和哈夫曼编码的程序:1.count函数统输入字符串的频数2.构建哈夫曼树3.求哈夫曼编码。但是求哈夫曼编码是,那个子函数出问题了,程序运行到那个函数时终止了,求各位大牛指导,代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MaxSize 52

struct TreeNode
{
    char ch;
    int weight;
    int parent;
    int lchild;
    int rchild;
};
typedef struct TreeNode HFTreeNode;
typedef HFTreeNode HuffmanTree;

struct CodeNode
{
    char ch;
    char bits[6];
};
typedef struct CodeNode CodeNode;
typedef CodeNode HuffmanCode[6];
void Count()
{
    char ch;char a[52]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n',
    'o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G',
    'H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
    int count[52]={0};int i; int j;
    for(j=0;j<52;j++)
       count[j]=0;
    printf("请输入一段英文字符:\n");
    ch=getchar();
    for(i=0;(i<100)&&(ch!='\n');i++)
    {
        for(j=0;j<52;j++)
        {
            if(ch==a[j])
            count[j]++;
        }
        ch=getchar();
    }
   
    printf("出现的字符和次数如下:\n");
    for(j=0;j<52;j++)
    {
        if(count[j]!=0)
        {
            printf("%c",a[j]);
            printf("    %d\n",count[j]);
        }
    }     
}
void SelectMin(HuffmanTree *HT,int g,int &s1,int &s2);
void CreateHuffmanTree(HuffmanTree *T,int n)
{
    int i,m,w,p1,p2;
    char a;
    if(n<1)
    {
        printf("不能构建哈弗曼树!");
        exit(1);
    }
    m=2*n;
    for(i=1;i<m;i++)
    {
        T[i].parent=0;
        T[i].lchild=0;
        T[i].rchild=0;
        T[i].weight=0;
         }
         
    printf("请输入叶子节点的权值:\n");     
    for(i=1;i<=n;i++)
    {
        scanf("%d",&w);
        T[i].weight=w;
        printf("   %d\n",w);
    }
   
    for(i=n+1;i<=m-1;i++)
    {
        SelectMin(T,i-1,p1,p2);
        T[p1].parent=T[p2].parent=i;
        T[i].lchild=p1;
        T[i].rchild=p2;
        T[i].weight=T[p1].weight+T[p2].weight;
    }
   
    for(i=1;i<=m-1;i++)
    {
        printf("%d",T[i].weight);
        printf("  %d",T[i].parent);
        printf("  %d",T[i].lchild);
        printf("  %d\n",T[i].rchild);
    }     
}
void SelectMin(HuffmanTree *HT,int g,int &s1,int &s2)
{
    int i,j,k,m,n;
    for(k=1;k<=g;k++)
    {
        if(HT[k].parent==0)
        {
            s1=k;
            break;
        }
    }
   
    for(j=i;j<=g;j++)
    {
        if((HT[j].weight<=HT[k].weight)&&(HT[j].parent==0))
        s1=j;
    }
   
    for(m=1;m<=g;m++)
    {
        if((HT[m].parent==0)&&(m!=s1))
        {
            s2=m;
            break;
        }
    }
    for(n=1;n<=g;n++)
    {
        if((HT[n].weight<=HT[m].weight)&&(HT[n].parent==0)&&(n!=s1))
        s2=n;
    }
}

void CharSetHuffmanEncoding(HuffmanTree *T,HuffmanCode *H)      
{
    int c,p,i,n;
    char a,cd[6];
    int start;
    cd[5]='\n';
    printf("请输入字符的种类数:");          //问题所在处
    scanf("%d",&n);
    printf("%d",n);
    for(i=1;i<=n;i++)
    {
        printf("请输入对应权值的字符:");
        a=getchar();
        H[i]->ch='a';
        start=5;
        c=i;
        while(p=T[c].parent>0)
        {
            if(T[p].lchild==c)
            {
                cd[--start]='0';
            }
            else{
                cd[--start]='1';
            }
            c=p;
        }
    strcpy(H[i]->bits,cd);   
    }
}
int main()
{
    HuffmanTree T[MaxSize];
    HuffmanCode H[6];
    int leaf_num;
    int i,s1,s2;
    Count();
    printf("请输入叶子数:");
    scanf("%d",&leaf_num);
    CreateHuffmanTree(T,leaf_num);
    CharSetHuffmanEncoding(T,H);
    for(i=1;i<=leaf_num;i++)
    {
        printf("%c",H[i]->ch);
        printf("%s",H[i]->bits);
    }
    return 0;
}
搜索更多相关主题的帖子: 字符串 parent include 
2016-04-17 22:45
Finalwinner
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2016-3-27
得分:0 
回复 楼主 Finalwinner
忘了说了,程序里面有些输出变量的函数,查错用的,有点突兀
2016-04-17 22:47
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
得分:0 
你这个似乎是死循环啊
程序代码:
while (p = T[c].parent>0)
        {
            if (T[p].lchild == c)
            {
                cd[--start] = '0';
            }
            else {
                cd[--start] = '1';
            }
            c = p;
        }
2016-04-18 09:09
Finalwinner
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2016-3-27
得分:0 
回复 3楼 grmmylbs
parent==0就跳出循环了啊。。。。
2016-04-18 12:45
Finalwinner
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2016-3-27
得分:0 
调试两天了,不知道是什么问题,心好累。各位大神帮忙看看啊。。。。
2016-04-18 12:48
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
得分:20 
while (p = T[c].parent>0)//赋值语句的优先级是最低的。所以这句话的结果是“T[c].parent大于零吗? 再把 1(或0)覆给p”
        {
            if (T[p].lchild == c)  //那么这里就是访问T【1】进行操作了。
            {
                cd[--start] = '0';
            }
            else {
                cd[--start] = '1';
            }
            c = p;           //类似的,又把c赋值为1.然后,,奏是个死循环了。
        }

φ(゜▽゜*)♪
2016-04-18 15:14
Finalwinner
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2016-3-27
得分:0 
回复 6楼 书生牛犊
好的,我在试试看,谢谢
2016-04-18 18:25
hsm
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2015-11-19
得分:0 
回复 7楼 Finalwinner
楼主有改好的吗,我也在写哈夫曼树,也是编译没有错,但是运行就崩了
2016-05-22 22:49
hsm
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2015-11-19
得分:0 
回复 3楼 grmmylbs
大神可以帮我看一下吗,我也是哈夫曼树编码,编译没有错,但是运行就崩了,https://bbs.bccn.net/thread-465141-1-1.html
2016-05-22 22:52



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-463762-1-1.html




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

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