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)
no1
和 no2
是按值传递的。出于所有实际目的,它们是临时对象。所以行
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;
}
我正在尝试制作霍夫曼编码器..但我遇到了一些问题...
这就是我定义节点结构的方式..
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)
no1
和 no2
是按值传递的。出于所有实际目的,它们是临时对象。所以行
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;
}