二分木探索プログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ぐっち

二分木探索プログラム

#1

投稿記事 by ぐっち » 14年前

今、線形探索プログラムをつくる過程で、int型の二分木にデータを追加する関数(引数は二分木へのポインタと追加する値、追加されたノードへのポインタを返す)をつくろうとしてます。
以前リストにデータを追加する関数をつくったのでそれを変更してつくろうとしているのですが途中までいってつまってしまいました。

方針としては
1、格納要素、左ノード、右ノードへのポインタをメンバに持つ構造体とノード総数、ルートノードへのポインタをメンバに持つ構造体をそれぞれ宣言。
2、malloc関数を使ってノードの領域を確保する関数BinaryTreeNodeAllocを作る。

ここまでは大丈夫です。

3、データを追加する関数LinkedListDataAddをつくる。
まず注目するノードへのポインタptr、直前ノードへのポインタprevを宣言して終端ノードに到着するまでループし、最後に新しく追加したノードを終端ノードにするという流れでやっていこうとしてます。ただリストとかとは違い、二分木条件やらが入ってきてわからなくなっています。

是非アドバイスをください。よろしくお願いします!

コード:

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);
}

non
記事: 1097
登録日時: 15年前

Re: 二分木探索プログラム

#2

投稿記事 by non » 14年前

ついこの前、「再帰呼び出しの2分探索木」というスレッドに、プログラムを書きましたが、再帰でよければ、それを参考にしてください。
再帰を使っていけないなら、プログラムを見ますので、そう仰ってください。
できれば、インデントしてほしいなぁ。
non

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 二分木探索プログラム

#3

投稿記事 by softya(ソフト屋) » 14年前

同じ方でしょうか? 
「C言語 二分木探索 | OKWave」
http://okwave.jp/qa/q6871102.html

マルチポストになりますので相互リンクをお願いします。詳しくはフォーラムルールを御覧ください。
http://dixq.net/board/board.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

box
記事: 2002
登録日時: 15年前

Re: 二分木探索プログラム

#4

投稿記事 by box » 14年前

回答しようとする側で動作確認できるよう、main()を付けてほしいと思います。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

ぐっち

Re: 二分木探索プログラム

#5

投稿記事 by ぐっち » 14年前

学校の課題なので、指示通りするのであれば再帰を使わないほうがいいかと思います。
知恵袋の方は同じクラスの友人だと思います。

non
記事: 1097
登録日時: 15年前

Re: 二分木探索プログラム

#6

投稿記事 by non » 14年前

>知恵袋の方は同じクラスの友人だと思います。

質問の文章まで他人のものをパクったってことですか。
じゃ、自分で前のプログラムも作っていないと言うことですね。
せめて、インデントをつけて、mainプログラムもつけてください。
non

non
記事: 1097
登録日時: 15年前

Re: 二分木探索プログラム

#7

投稿記事 by non » 14年前

ざっと見てたのですが、

>3、データを追加する関数LinkedListDataAddをつくる。
と書いてありますが、
プログラムでは
>BinaryTreeNode *BinaryTreeDataAdd(BinaryTree *list, int x)
です。
この2つの関数の関係は?
また、これは単に間違いだとすると、
>BinaryTreeNode *BinaryTreeDataAdd(BinaryTree *list, int x)
この関数は、何のために BinaryTreeNode * を返すのですか?
先生から与えられている仕様ですか?
non

閉鎖

“C言語何でも質問掲示板” へ戻る