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() は、常に 2 つの新しい子ノードを currentNYT ノードに追加します。左の子は newNYT になり、右のノードは関数の引数として送信された値を持つノードになります。addNode() の次の呼び出しでも同じことが行われますが、2 つの新しいノードの親は newNYT になるため、addNode() の最初の呼び出しの後、currentNYT は newNYT を指す必要があります。

currentNYT は常に、次の addNode() の呼び出しで親として機能するノードを指します。

誰かが助けてくれることを本当に願っています。

于 2009-11-17T21:01:22.550 に答える