質問

私は、適応型ハフマン符号を実装しようとしていますが、行のコードを実行するとき、ツリーを構築しようとしている私は、セグメンテーションフォールトを取得しながら、「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
役に立ちましたか?

解決

以下は、最初のエラーのようです...

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

おそらくたい

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

ではなく

他のヒント

これを見ます:

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

あなたは、あなたがrootNULLを設定し、currentNYTするrootを設定します。そのため、常にcurrentNYT NULLです。

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;

はい取り除くcurrentNYT =ルートは私がセグメンテーションフォルトを取り除くだろうが、残念ながらそれは私がやりたいことはありません。

私は自分のツリーを初期化したいです。ルートは、NULLお子様連れの空になります。 currentNYTは、当初のルートを指すようになります。

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

currentNYTはいつもにaddNode()の次の呼び出しで親となるノードを指します。

私は本当に誰かを助けることができると思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top