2009-11-17 3 views
0

Я пытаюсь реализовать адаптивный код хаффмана, но при попытке построить дерево я получаю ошибку сегментации при выполнении кода в строке «currentNYT-> lchild = newNYT;» в функции addnode().Ошибка сегментации - Adaptive Huffman Tree

Может ли кто-нибудь помочь мне? Это может быть что-то простое, о котором я не знаю. не использовал C некоторое время.

//variable and type declarations 

struct treeElement { 
    unsigned long weight; 
    unsigned short id; 
    char chr; 
    struct treeElement *lchild, *rchild, *parent; 
}; 

typedef struct treeElement node; 

node *root, *currentNYT; 

//functions 

void initTree() { 
    root = NULL; 
    currentNYT = malloc(sizeof(node)); 
    currentNYT = root; 
} //initTree 

void addNode(char newNodeChr) { 
    node *newNYT, *newExternal; 
    newNYT = malloc(sizeof(node)); 
    newNYT->id=maxNodes-idCount; idCount++; 
    newNYT->chr='\0'; 
    newNYT->weight=0; 
    newNYT->parent=currentNYT; 
    newNYT->lchild=newNYT->rchild=NULL; 
    newExternal = malloc(sizeof(node)); 
    newExternal->id=maxNodes-idCount; 
    newExternal->chr=newNodeChr; 
    newExternal->weight=1; 
    newExternal->parent=currentNYT; 
    newExternal->lchild=newExternal->rchild=NULL; 
    currentNYT->lchild = newNYT; 
    currentNYT->rchild = newExternal; 
    currentNYT=newNYT; 
} //addNode 

ответ

0

Ниже представляется первая ошибка ...

currentNYT = malloc(sizeof(node)); 
currentNYT = root; 

Вероятно, хотят

root = malloc(sizeof(node)); 
currentNYT = root; 

вместо

0
root = NULL; 
currentNYT = malloc(sizeof(node)); 
currentNYT = root; 

Гм, вы устанавливаете currentNYT в NULL. Вы хотели бы сделать:

root = currentNYT; 

вместо этого?

Вы также можете инициализировать элементы этого узла. О, и, возможно, проверить, что malloc удалось?

Может быть понятнее сделать

root = malloc(sizeof(node)); 
if (!root) { 
    /* panic! */ 
} 
root->.... = whatever; /* for each of the elements of the struct */ 
currentNYT = root; 
0

Посмотрите на это:

root = NULL; 
currentNYT = malloc(sizeof(node)); 
currentNYT = root; 

Вы устанавливаете root в NULL, то вы установите currentNYT в root. Поэтому currentNYT всегда NULL.

0

Да удаление currentNYT = корень получит мне избавиться от Segfault, но, к сожалению, он не будет делать то, что я хочу.

Я хочу инициализировать свое дерево. Корень будет пустым с NULL-дочерними элементами. currentNYT будет сначала указывать на root.

addNode() всегда будет добавлять два новых дочерних узла к текущему узлуNYT. Левым ребенком будет newNYT, а правый узел будет узлом, который имеет значение, отправленное как аргумент функции. Следующий вызов addNode() будет делать то же самое, но родителем двух новых узлов будет newNYT, поэтому currentNYT должен указывать на newNYT после первого вызова addNode().

currentNYT всегда указывает на узел, который будет служить родителем при следующем вызове addNode().

Я действительно надеюсь, что кто-то может помочь.

+0

Возможно, вам лучше всего перенаправить на новый вопрос. – caf

Смежные вопросы