Ошибка сегментации - адаптивное дерево Хаффмана
Я пытаюсь реализовать адаптивный код Хаффмана, но при попытке построить дерево я получаю ошибку сегментации при выполнении кода в строке "currentNYT->lchild = newNYT;" в функции addnode().
Может ли кто-нибудь помочь мне? Это может быть что-то простое, о чем я не знаю. некоторое время не использовал 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
4 ответа
Следующее, кажется, первая ошибка...
currentNYT = malloc(sizeof(node));
currentNYT = root;
Наверное хочу
root = malloc(sizeof(node));
currentNYT = root;
вместо
Посмотри на это:
root = NULL;
currentNYT = malloc(sizeof(node));
currentNYT = root;
Ты устанавливаешь root
в NULL
тогда вы установили currentNYT
в root
, Следовательно currentNYT
всегда NULL
,
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;
Да, удаление currentNYT = root избавит меня от segfault, но, к сожалению, он не будет делать то, что я хочу.
Я хочу инициализировать мое дерево. Корень будет пустым с пустыми дочерними элементами. currentNYT изначально будет указывать на root.
addNode() всегда добавляет два новых дочерних узла к узлу currentNYT. Левым потомком будет newNYT, а правым узлом будет узел, значение которого отправлено в качестве аргумента функции. Следующий вызов addNode() будет делать то же самое, но родителем двух новых узлов будет newNYT, поэтому currentNYT должен указывать на newNYT после первого вызова addNode().
currentNYT всегда будет указывать на узел, который будет служить родительским при следующем вызове addNode().
Я действительно надеюсь, что кто-то может помочь.