![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
今、int型の二分木にデータを追加する関数(引数は二分木へのポインタと追加する値、追加されたノードへのポインタを返す)をつくろうとしてます。
以前リストにデータを追加する関数をつくったのでそれを変更してつくろうとしているのですが途中までいってつまってしまいました。
つくりかたを教えてください。
よろしくお願いします!
struct BinaryTreeNode{
int data;
struct BinaryTreeNode *l_next;
struct BinaryTreeNode *r_next;
};
struct BinaryTree{
int node_num;
struct BinaryTreeNode *root;
};
BinaryTreeNode *BinaryTreeNodeAlloc(void)
{
BinaryTreeNode *node;
node = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
if (node == NULL) {
return (NULL);
}
node->l_next = NULL;
node->r_next = NULL;
return (node);
}
BinaryTreeNode *BinaryTreeDataAdd(BinaryTree *list, int x)
{
BinaryTreeNode *ptr;
BinaryTreeNode *prev;
BinaryTreeNode *new_node;
ptr = list->root;
prev = NULL;
while (ptr) { ←??
if (ptr->data < x) {
prev = ptr;
ptr = ptr->next;
} else if (ptr->data == x) {
return (NULL);
} else {
new_node = BinaryTreeNodeAlloc();
if (new_node == NULL) {
exit (0); ←??
}
new_node->data = x;
new_node->next = ptr;
if (prev != NULL) {
prev->next = new_node;
} else {
list->head = new_node;
}
list->node_num++;
return (new_node);
}
}
new_node = BinaryTreeNodeAlloc();
if (new_node == NULL) {
exit (0);
}
new_node->data = x;
new_node->r_next = NULL;
new_node->l_next = NULL;
if (prev != NULL) {
prev->next = new_node;
} else {
list->head = new_node;
}
list->node_num++;
return (new_node);
}
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
BinaryTreeNode *BinaryTreeDataAdd(BinaryTreeNode *ptr, int x)
{
BinaryTreeNode **parent;
BinaryTreeNode *new_node;
while (ptr) {
if (ptr->data < x) {
if (ptr->l_next!=NULL) return(BinaryTreeDataAdd(ptr->l_next, x));
else parent = &(ptr->l_next);
}
else if (ptr->data > x) {
if (ptr->r_next!=NULL) return(BinaryTreeDataAdd(ptr->r_next, x));
else parent = &(ptr->r_next);
}
else if (ptr->data == x) return(NULL);
new_node = BinaryTreeNodeAlloc();
if (new_node == NULL) exit(0);
new_node->data = x;
(*parent)=new_node;
list->node_num++;
return (new_node);
}
でメインからBinaryTreeDataAdd(list->root, x);を呼んでください
No.3
- 回答日時:
そうですね, 図を使って「こういう二分木にこれを追加したらこうなってほしい」というのを明確にしてから「じゃあどうしようか」と考えるのは, 私もいいことだと思います>#2. 少なくとも「どこがおかしいかはともかくどこかはおかしい」ということはわかりますしね.
しかし, 「二分木条件」ってなんだろう....
No.2
- 回答日時:
ダラダラとした説明じゃ、プログラムになんかできません。
箇条書き程度に。まずは、実際のプログラム用語なんか使わずにやり方を考えましょう。mallocだのポインタだのは、最後にCのプログラムにする段階で考えればよいことです。
混乱したら、いったんプログラムから離れることをお勧めします。
紙に図を書いてみるとか。
今回のだったら、ハンガーにハンガーひっかけて「二分木」を作って、新しいハンガーを適切な場所にひっかけるにはどうするのがいいか、実際にやってみるのも手です。
このとき、人間的な目線でやらないこと。例えば、全体を見て「ココ!」とかいうように。
どういう考えでどっちの枝を辿ったのか、ひっかけるときにどんな作業をするのか、事細かくメモしてみましょう。
プログラムなんてものは、上のような人間の言葉で書いたやりかたを、コンピュータの言葉に置き換えるだけのものです。
No.1
- 回答日時:
あなたは何を考えたのですか?
単にプログラムを載せるのではなく,
・どのような戦略でいこうとしているのか
・どこまでできて, どこで詰まっているのか
などを言葉できちんと書いてください.
あと, 人に見せるプログラムならそのことをちゃんと意識してほしい. コメントくらいつけられないの?
この回答への補足
1、格納要素、左ノード、右ノードへのポインタをメンバに持つ構造体とノード総数、ルートノードへのポインタをメンバに持つ構造体をそれぞれ宣言。
2、malloc関数を使ってノードの領域を確保する関数BinaryTreeNodeAllocを作る。
ここまでは大丈夫です。
3、データを追加する関数LinkedListDataAddをつくる。
まず注目するノードへのポインタptr、直前ノードへのポインタprevを宣言して終端ノードに到着するまでループし、最後に新しく追加したノードを終端ノードにするという流れでやっていこうとしてます。ただ線形探索とは違い、二分木条件やらが入ってきてわからなくなっています。
説明不足で申し訳ありません。
これでお答えしていただけますでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# leetcode21 1 2022/04/21 11:53
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- C言語・C++・C# C言語 leetcode21 Merge Two Sorted Lists 2 2022/04/24 19:35
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
構造体のリスト削除
-
「指定されたキャストは有効で...
-
Enterキーを押されたら次の処理...
-
C言語での引数の省略方法
-
信頼区間の1.96や1.65ってどこ...
-
2÷3などの余りについて
-
マイナスからプラスへ転じた時...
-
プログラムでの数字につく”f”の...
-
DWORDの実際の型は何でしょうか
-
正負を反転させて出力するプロ...
-
「Aに対するBの割合」と「Aに対...
-
#define _CRT_SECURE_NO_WARNIN...
-
ダメだ・・・分からない。while...
-
VB.net Double と...
-
Aの値からBの値を除するとは??
-
2重定義って??
-
テキストデータをそのままバイ...
-
long型の定数の末尾にLを付ける...
-
(int *)の意味
-
C言語について。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構造体のリスト削除
-
InvokeMemberメソッドとは何を...
-
ばばぬきプログラムについて
-
C言語 リスト
-
C言語 dequeue
-
C# ref引数のnull判定
-
C言語
-
双方向リストのバブルソートに...
-
API 録音 MCI
-
ご教授ください。Segmentation ...
-
C♯ 2段構造のcontextMenuStrip?
-
リスト構造
-
コールバック関数はnullになら...
-
連結リストをソート
-
今度はdoubly linked listの問...
-
C言語 二分木探索
-
「Nz」は何て読むのでしょうか?
-
バブルソートを使って文字列を...
-
【C++】ストリームオブジェクト...
-
別formの多重起動防止
おすすめ情報