Cで英単語の処理をするプログラムを作るために、二分探索木を実装しています。
二分探索木で新たなノードを追加する再帰関数を書いたのですが、構造体のポインタに関して分からない事があったので質問させてください。
二分探索木のノードの構造体と、ノードを追加する関数↓
C
1/* ノードの構造体 */ 2typedef struct BINNODE { 3 char *word; 4 struct BINNODE *pLeft; 5 struct BINNODE *pRight; 6} BinNode; 7 8/* pNodeの木にwordをメンバ変数に持つノードを追加する再帰関数 */ 9BinNode *apndNode(BinNode *pNode, char *word) { 10 int cond; 11 if(pNode == NULL) { 12 pNode = (BinNode*)malloc(sizeof(BinNode)); 13 pNode->word = (char*)malloc(strlen(word)+1); 14 strcpy(pNode->word, word); 15 pNode->pLeft = pNode->pRight = NULL; 16 } 17 else if(strcmp(pNode->word, word) < 0) 18 pNode->pRight = apndNode(pNode->pRight, word); //"pNode->pRight = "はなぜいる? 19 else 20 pNode->pLeft = apndNode(pNode->pLeft, word); //"pNode->pLeft = "はなぜいる? 21 return pNode; 22}
下から4行目と2行目の
**pNode->pRight = apndNode(pNode->pRight, word);と
pNode->pLeft = apndNode(pNode->pRight, word);
なのですが、pNode->pRight,pNode-pLeftへ代入する処理をなくしてapndNode関数だけ呼び出すようにした場合、ノードへの変更が反映されなくなりました。(例えば apndNode(rootNode->pRight, hoge)**を呼び出してもrootNode->pRightはNULLのままになってしまう)
ポインタ渡しならば、apndNode(pNode->pRight, word)を呼び出すだけでpNode->pRightのメモリの確保やメンバ変数の変更も反映されると思うのですが、なぜ代入をしないと反映されなくなるのでしょうか。
実行環境はvscodeです。
拙い説明ですが、回答よろしくお願いいたします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/01 14:20