Ошибка сегментации - адаптивное дерево Хаффмана - PullRequest
0 голосов
/ 17 ноября 2009

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

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

//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

Ответы [ 4 ]

0 голосов
/ 18 ноября 2009

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

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

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

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

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

0 голосов
/ 17 ноября 2009

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

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

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

0 голосов
/ 17 ноября 2009

Следующая ошибка кажется первой ...

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

Наверное, хочу

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

вместо

0 голосов
/ 17 ноября 2009
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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...