鱼C论坛

 找回密码
 立即注册
查看: 2932|回复: 2

建立的霍夫曼树被遍历时子树的值居然还会变?求救

[复制链接]
发表于 2018-3-2 00:47:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 t6am3 于 2018-3-2 10:15 编辑

编译环境VC6.0
今天在B站上看小甲鱼老师的数据结构及算法教程,学习到霍夫曼树的建立,于是先暂停视频想自己先编一下
编完之后 调试发现 创建霍夫曼树的函数已经返回了一棵完整的霍夫曼树 过程如图:

在遍历函数中调用还是完整的

在遍历函数中调用还是完整的

我怀疑是VC6.0编译器的问题 因为以前也出现过好几次这种情况就是单步调试的时候发现不可能变值的地方值变了。。。
附上我的代码:另外本人纯属新手,代码冗杂,欢迎教导,感谢各位大佬的帮助!!!
#include <stdio.h>
#include <stdlib.h>
//#include <time.h>
// For BTREE;
#define MAX_SIZE 20
struct BTREE
{
        int data;
        struct BTREE *leftchild;
        struct BTREE *rightchild;
};

struct Cmp
{
        int data;
        int tag;
};

void print_preorder_recursion( struct BTREE *x )
{
        printf("%d ", x->data);
        if( NULL != x->leftchild )
                print_preorder_recursion( x->leftchild );
        if( NULL != x->rightchild )
                print_preorder_recursion( x->rightchild );
}

void Insert( struct Cmp *p, struct Cmp *t, int n )
{
        int i = 0;
        while( (p + i)->data < t->data && i < n )
        {
                i++;
        }
        for( ; i > 0; i-- )
        {
                *(p-1) = *p;
                p++;
        }
        *(p-1) = *t;
}

void swap( struct Cmp *a, struct Cmp *b )
{
        struct Cmp tmp;
        tmp = *a;
        *a = *b;
        *b = tmp;
}

void Sort( struct Cmp *p, int n )
{
        int i, j;
        for( i = 1; i < n; i++ )
                for( j = i ; j >= 0; j-- )
                {
                        if( p[j].data < p[j-1].data )
                                swap( &p[j], &p[j-1] );
                }
}

struct BTREE *Huffman_Generate( struct BTREE *p, int n )
{
        struct BTREE *t;
        int i, h = n, m = n;
        struct Cmp Tag[MAX_SIZE], tmp, *g;
        for( i = 0; i < n; i++ )
        {
                Tag[i].data = p[i].data;
                Tag[i].tag = i;
        }
        Sort( Tag, n );
        g = Tag;
        while( 1 )
        {
                t = (struct BTREE *)malloc(sizeof(struct BTREE));
                t->data = (p+g->tag)->data + (p+(g+1)->tag)->data;
                t->leftchild = p+g->tag;
                g++;
                h--;
                t->rightchild = p+g->tag;
                g++;
                h--;
                tmp.data = t->data;
                tmp.tag = m++;
                p[tmp.tag] = *t;
                Insert( g, &tmp, h );//zuihouyici charu de shihou youwenti ..qing xiugai charu hanshu yiji h de zhi youdaishangque.
                g--;
                h++;
                if( 1 == h )
                        break;
        }
        return t;
}

struct BTREE *Huffman()
{
        int i, n;
        struct BTREE node[MAX_SIZE];
        printf("Plz input the nodes you possess:\n");
        scanf("%d", &n);
        for( i = 0; i < n; i++ )
        {
                printf("Plz input %d weight of the node:\n", i+1);
                //getchar();
                scanf("%d", &node[i].data);
                node[i].leftchild = NULL;
                node[i].rightchild = NULL;
        }
        printf("Generating your huffman tree......\nDone!\n");
        return ( Huffman_Generate( node, n ) );
}

void main()
{
        struct BTREE *m;
        m = Huffman();
        print_preorder_recursion( m );
        putchar('\n');
}

已经创建的霍夫曼树

已经创建的霍夫曼树

执行完这个if语句左子树的值居然变了???

执行完这个if语句左子树的值居然变了???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-2 00:55:53 | 显示全部楼层
好像我知道咋回事了。。。我在创建霍夫曼树的函数中创建了这些节点并赋值 创建函数结束后的节点空间是可变的 然后就自己变了 对吧……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-2 10:07:37 | 显示全部楼层
t6am3 发表于 2018-3-2 00:55
好像我知道咋回事了。。。我在创建霍夫曼树的函数中创建了这些节点并赋值 创建函数结束后的节点空间是可变 ...

确实是这样的。。。解决啦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 00:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表