c中的节点和结构

nodes and structures in c

我正在尝试制作霍夫曼编码器..但我遇到了一些问题...

这就是我定义节点结构的方式..

struct node{

int type,prob;
char *code;
struct node *left, *right;

};

我按概率排序并创建一个新节点

struct node join_nodes(struct node no1, struct node no2)
{
    struct node aux; 

    aux.type = 1; 
    aux.prob = no1.prob + no2.prob;
    aux.right = &no1; 
    aux.left = &no2;

    return aux;

}

然后我将这个新节点放入节点列表中..

   void sort_hufman(struct node order_list[], struct node list[])
{
        int i = N, len = N; 
        struct node aux;
        for(i=N; i>N-2;i--)
        {
                sort(order_list, i);
                len = len +1; 

                aux = join_nodes(order_list[i-1],order_list[i-2]);

                list[len-1] = order_list[i-2] = aux;

        }
}

问题是,在这个函数中,我的第一个子节点类型是 0 和 0,这意味着它们是叶子,但是当我检查代码时,它们变成了类型 1 和 0 ...我认为这是因为(我不知道为什么子节点的指针指向同一个方向)..但它不能改变..

其中列表和顺序列表我定义为 *list 并且我使用 malloc 将 space 保存在内存中...

我不知道这是怎么回事...

谁能帮帮我??

你的代码至少有两个问题:一个严重,一个在命名方面。


函数中

struct node join_nodes(struct node no1, struct node no2)

no1no2 是按值传递的。出于所有实际目的,它们是临时对象。所以行

aux.right = &no1; 
aux.left = &no2;

有问题。您将指针指向即将消亡的对象。一旦函数存在,你就不能指望它们中的任何东西。它们只是垃圾对象。

考虑按地址而不是按值传递对象:

struct node join_nodes(struct node *no1, struct node *no2)
{
Tnode_pointer aux = (Tnode_pointer)malloc(sizeof(Tnode));

    aux->type = 1; 
    aux->prob = no1->prob + no2->prob;
    aux->right = no1; 
    aux->left = no2;

    return aux;
}

aux = join_nodes(order_list[i-1],order_list[i-2]);

struct node{
...
int ...prob;
};

这肯定不是概率。你的意思可能是基数。

typedef struct node *Tnode_pointer;    
typedef struct node {
    int type,prob;
    char *code;
    Tnode_pointer left, right;
} Tnode;

Tnode_pointer join_nodes(Tnode no1, Tnode no2)
{
    Tnode_pointer aux = (Tnode_pointer)malloc(sizeof(Tnode));

    aux->type = 1; 
    aux->prob = no1.prob + no2.prob;
    aux->right = &no1; 
    aux->left = &no2;

    return aux;
}
//I'm sorry I had to change the arguments to your function 

typedef struct node *Tnode_pointer;    
typedef struct node {
    int type,prob;
    char *code;
    Tnode_pointer left, right;
} Tnode;

Tnode_pointer join_nodes(Tnode *no1, Tnode *no2)
{
    Tnode_pointer aux = (Tnode_pointer)malloc(sizeof(Tnode));

    aux->type = 1; 
    aux->prob = no1->prob + no2->prob;
    aux->right = no1; 
    aux->left = no2;

    return aux;
}