セグメンテーションフォールト - 適応ハフマンツリー
-
20-09-2019 - |
質問
私は、適応型ハフマン符号を実装しようとしていますが、行のコードを実行するとき、ツリーを構築しようとしている私は、セグメンテーションフォールトを取得しながら、「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;
あなたは、あなたがroot
にNULL
を設定し、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()の次の呼び出しで親となるノードを指します。
私は本当に誰かを助けることができると思います。