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