分段故障 - 自适应霍夫曼树

时间:2009-11-17 20:40:50

标签: c segmentation-fault huffman-code adaptive-compression

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

答案 0 :(得分: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;

答案 1 :(得分:0)

看看这个:

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

您将root设置为NULL,然后将currentNYT设置为root。因此,currentNYT始终为NULL

答案 2 :(得分:0)

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

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

可能想要

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

代替

答案 3 :(得分:0)

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

我想初始化我的树。对于NULL子项,根将为空。 currentNYT最初将指向root。

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

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

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