2009-11-17 32 views
0

我试图实现自适应huffman代码,但在尝试构建树时,我在执行代码时出现了段错误“currentNYT-> lchild = newNYT;”在addnode()函数中。分段错误 - 自适应Huffman树

任何人都可以请帮我吗?这可能是简单的,我不知道。现在暂时不使用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; 

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

0

是删除currentNYT =根会让我摆脱段错误的无奈它不会做我想要的。

我想初始化我的树。 NULL子元素的根将为空。 currentNYT将最初指向根。

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

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

我真的很希望有人能帮上忙。

+0

你可能是最好的重新发布作为一个新的问题。 – caf 2009-11-17 21:38:51