2015-06-21 3 views
0

Я пытаюсь сделать HUFFMAN кодировщик .. но у меня возникают некоторые проблемы ...узлы и сооружения с

Это, как я определяю свою структуру узла ..

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; 

     } 
} 

Дело в том, что в этом Fuctions мой первый типы субномов равны 0 и 0, это означает, что они являются листьями, но я чешу в коде, который они изменяют, для типа 1 и 0 ... Я думаю, что это потому, что (я не знаю, почему указатели подузлов указывают на то же направление) .. но он не должен меняться ..

где список и список заказа я определил как * список и я сохранил место в памяти с помощью таНоса ...

Я не знаю, что это происходит ...

кто может мне помочь ??

ответ

0

Существует, по крайней мере, две проблемы с вашим кодом: один серьезный, один с точки зрения именования.


В функции

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; 
}; 

Это, конечно, не вероятность. Вы имеете в виду, вероятно, мощность.

+0

ооо спасибо .. Я думал, что, когда я прохожу по значению аргумент его значение не изменится ... , но я не знаю, что значение будет disapear .. потому что вы указываете на направления no1 и no2, а не на переменные, которые вы проходите. Так что я не понимаю, когда я делаю joint_nodes (список [1], список [2]), например .. Что происходит с пропущенными точками от списка [1] и списком [2] ?? –

+0

Я знаю, что actualy не является вероятностью, потому что это не значение между 0 и 1 .. это вы имеете в виду? Thaks снова! –

+0

'aux-> prob = no1-> prob + no2-> prob;' Вы изменили их на указатель, помните? – wildplasser

-1
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; 
} 
+0

Извините, вы принимаете адреса времен. Это серьезная ошибка. –

+0

Извините, я на самом деле спешил :) аргумент функции должен быть (Tnode * no1, Tnode * no2) – Lukas

+0

Нечего извиняться. Если вы отредактируете свой ответ, я буду рад удалить нижний план. –

0
//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; 
}