0

我正在尝试实现自适应霍夫曼代码,但是在尝试构建树时,在“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

4 回答 4

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;
于 2009-11-17T20:42:58.220 回答
0

看这个:

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

你设置rootNULL,然后你设置currentNYTroot。因此currentNYT总是NULL

于 2009-11-17T20:43:44.287 回答
0

以下似乎是第一个错误...

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

大概想要

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

反而

于 2009-11-17T20:44:51.320 回答
0

是的,删除 currentNYT = root 将使我摆脱段错误,但不幸的是它不会做我想要的。

我想初始化我的树。根为空,子节点为 NULL。currentNYT 最初将指向根。

addNode() 将始终将两个新子节点添加到 currentNYT 节点。左子节点将是 newNYT,右节点将是具有作为函数参数发送的值的节点。下一次调用 addNode() 将执行相同的操作,但两个新节点的父节点将是 newNYT,因此 currentNYT 必须在第一次调用 addNode() 后指向 newNYT。

currentNYT 将始终指向将在下一次调用 addNode() 时充当父节点的节点。

我真的希望有人能提供帮助。

于 2009-11-17T21:01:22.550 回答