【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.22540

キューとツリーについて
投稿者---CENTER(2005/08/10 01:44:57)


CENTERです。
ある本に載っていたところでわからない部分があるので質問がありますので
わかる方がいたら教えていただけないでしょうか・・・

キューについての質問
キューのプログラムのcountというのは、なんのための変数ですか?
rbuf[(head + count) % MAX] = c;の部分で%となっているのは
なぜですか?
head = ++head % MAX;の部分の処理もわかりません。

ツリーについての質問
typdef struct node_t {
    int val;
    struct node_t *lson; /* left son */
        struct node_t *rson: /* right son */
} NODE;
上記の構造体の各メンバーというのは、どういう役割ですか?

newとnodeというのは、それぞれ何をあらわしているのですか?
構造体自体は、同じですよね・・・

if (new->val == node->val)
        return; /* 値が同じなので追加しない */
という条件がありますが、なぜですか?
new->val > node->valの条件とnew->val < node->valの
条件もわかりません。

node->rson = new; /* 右側に追加 */
node->lson = new; /* 左側に追加 */
上記のようにありますが、newというのは
変数の名前ですよね・・・

add_node(rson,new);
add_node(lson,new);
上記のように自分自身を呼び出しているのですが
こういうことは、あるのですか?
意味的には、どういう意味になりますか?

とにかくツリーについては、順序よく説明してくださるかたいませんか?

キュー

データを引数にしてbuf_in()関数を呼び出すことにより、データがキューに
格納される。また、buf_out()関数を呼び出すことにより、戻り値としてキュ
ーからデータを取り出すことができる。
tailはデータを入れるべき位置で、headは取り出すデータがある位置を示す。

int rbuf[MAX];
int head = 0;
int count = 0;

int buf_in(int c)
{
    if (count == MAX) /* buffer full */
        return (ERROR);
    rbuf[(head + count) % MAX] = c;
    ++count;
    return (c);
}

int buf_out(void)
{
    int r;

    if (count == 0) /* buffer empty */
        return (ERROR);
    r = rbuf[head];
    head = ++head % MAX;
    return (r);
}

ツリー

typdef struct node_t {
    int val;
    struct node_t *lson; /* left son */
        struct node_t *rson: /* right son */
} NODE;

/*
 * sorting された二分木にノードを追加
 */

void add_node(NODE *node, NODE *new)
{
    if (new->val == node->val)
        return; /* 値が同じなので追加しない */
    else if (new->val > node->val) {
        if (node->rson == NULL)
        node->rson = new; /* 右側に追加 */
        else
        add_node(rson,new);
    }
    else if (new->val < node->val) {
        if (node->lson == NULL)
        node->lson = new; /* 左側に追加 */
        else
        add_node(lson,new);
    }
}

ご指導よろしくお願いします。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:キューとツリーについて 22541 まきじ 2005/08/10 03:01:13
<子記事> Re:キューとツリーについて 22543 かずま 2005/08/10 03:12:24
<子記事> Re:キューとツリーについて 22544 YuO 2005/08/10 11:05:17


No.22541

Re:キューとツリーについて
投稿者---まきじ(2005/08/10 03:01:13)


>キューのプログラムのcountというのは、なんのための変数ですか?

現在、キューに格納されている、要素の数。

>rbuf[(head + count) % MAX] = c;の部分で%となっているのは
>なぜですか?

head から MAX 個の要素だから、MAX が 5 だとして
キューから取り出し head が 2 になった場合に
rbuf[4] までくると、配列はいっぱいなので、次に要素を追加
しようとしたら、オーバーしてしまうので
0 に戻す為に (head + count) % MAX という計算になってます。

>head = ++head % MAX;の部分の処理もわかりません。

head が 4 の時、次取り出すのは、rbuf[0] の位置だから。
追加と同じ仕組み。

ツリーについての質問
>typdef struct node_t {
> int val;
> struct node_t *lson; /* left son */
> struct node_t *rson: /* right son */
>} NODE;
>上記の構造体の各メンバーというのは、どういう役割ですか?

val は値。
lson は左側の子
rson は右側の子

>newとnodeというのは、それぞれ何をあらわしているのですか?

new は新しい節。
node は追加する節の親。

>構造体自体は、同じですよね・・・

型は同じ。

>if (new->val == node->val)
> return; /* 値が同じなので追加しない */
>という条件がありますが、なぜですか?

同じ値は存在しないから。

>new->val > node->valの条件とnew->val < node->valの
>条件もわかりません。

節と比べて、値が大きいければ右へ
小さければ、左へ、繋げるから。

>node->rson = new; /* 右側に追加 */
>node->lson = new; /* 左側に追加 */
>上記のようにありますが、newというのは
>変数の名前ですよね・・・

そうです。

>add_node(rson,new);
>add_node(lson,new);
>上記のように自分自身を呼び出しているのですが
>こういうことは、あるのですか?

あります。再帰です。

>意味的には、どういう意味になりますか?

右に追加と左に追加。


この投稿にコメントする

削除パスワード

No.22543

Re:キューとツリーについて
投稿者---かずま(2005/08/10 03:12:24)


> ある本に載っていたところでわからない部分があるので質問がありますので
> わかる方がいたら教えていただけないでしょうか・・・

出典を示さずに著作物を引用するのは著作権法に違反しています。「ある本」
と書かずに、ちゃんと書名と第何章あるいは何ページからの引用かを書いたほ
うがいいと思いますよ。また、著者に無断で引用するのはいけないと誤解して
いる人がいますが、出典を示せば、著者に引用の許しをもらう必要はないこと
が著作権法に記されています。

> キューのプログラムのcountというのは、なんのための変数ですか?
> rbuf[(head + count) % MAX] = c;の部分で%となっているのは
> なぜですか?

rbuf:  キューを実現するための配列 (ring buffer)
head:  キューに入っているデータの先頭の位置
count: キューに入っているデータの個数
MAX:   配列の要素数
c:     キューに入れる新しいデータ

rbuf[head] 〜 rbuf[head + count - 1] に count 個のデータが入っている
ので、新しいデータ c は rbuf[head + count] に入れたい。でも、それは
配列のサイズを超えているかもしれません。% MAX で余りを求めることで、
配列の先頭に戻って、データを入れることができます。そこに空きがあること
は事前に確認しています。


> head = ++head % MAX;の部分の処理もわかりません。

キューからデータを取り出したので ++head でデータの先頭位置を進めます。
でも、配列のサイズを超えてはいけないので % MAX で余りを求めて、先頭に
戻しています。


> ツリーについての質問
> typdef struct node_t {
>     int val;
>     struct node_t *lson; /* left son */
>         struct node_t *rson: /* right son */
> } NODE;
> 上記の構造体の各メンバーというのは、どういう役割ですか?

その本は、本当にダメな本です。著者が自分の知識をひけらかすために、あれ
もこれもと書いていますが、その説明が満足にされていません。だから、入門
者は疑問と不安だらけで読むことに挫折してしまうものと思われます。


> add_node(rson,new);
> add_node(lson,new);
> 上記のように自分自身を呼び出しているのですが
> こういうことは、あるのですか?

関数の再帰呼び出しをしておきながら、その本には、再帰呼び出しの説明が
いっさいありません。何のための入門書でしょうか。



この投稿にコメントする

削除パスワード

No.22544

Re:キューとツリーについて
投稿者---YuO(2005/08/10 11:05:17)


細かいことですが……。


head = ++head % MAX;の部分の処理もわかりません。


これは未定義の結果になりますから,やってはいけないことです。
head = (head + 1) % MAX;

というのが,著者が書きたかったことだと思いますが……。



この投稿にコメントする

削除パスワード

No.22548

Re:キューとツリーについて
投稿者---επιστημη(2005/08/10 15:42:05)


> head = ++head % MAX;の部分の処理もわかりません。
>これは未定義の結果になりますから,やってはいけないことです。

そ、そぉお? head++ ならわからんでもないけど…
# あれ? 僕の勘違いかしら?





この投稿にコメントする

削除パスワード

No.22552

Re:キューとツリーについて
投稿者---とおり(2005/08/10 15:49:58)


>そ、そぉお? head++ ならわからんでもないけど…

++headだと、increment後にしっかりシーケンスポイントが存在することになるのでしょうか?


この投稿にコメントする

削除パスワード

No.22556

Re:キューとツリーについて
投稿者---YuO(2005/08/10 16:00:29)


>> head = ++head % MAX;の部分の処理もわかりません。
>>これは未定義の結果になりますから,やってはいけないことです。
>そ、そぉお? head++ ならわからんでもないけど…

この式文には,副作用完了点は,この式文の末尾にしかないです。
# ISO/IEC 9899:1999 Annex.C

そして,headに対する副作用が2つありますから,未定義の振る舞いとなります。
# 同 6.5 Expressions Paragraph. 2



この投稿にコメントする

削除パスワード

No.22562

Re:キューとツリーについて
投稿者---Hermit(2005/08/10 20:07:32)


>>> head = ++head % MAX;の部分の処理もわかりません。
>この式文には,副作用完了点は,この式文の末尾にしかないです。
># ISO/IEC 9899:1999 Annex.C
>そして,headに対する副作用が2つありますから,未定義の振る舞いとなります。

head をインクリメントする、
head % MAX を計算する。
計算した値を、head に代入する。

特に問題は無い気がしますが。



この投稿にコメントする

削除パスワード

No.22563

Re:キューとツリーについて
投稿者---まきじ(2005/08/10 21:05:31)


>特に問題は無い気がしますが。

X3010 6.5 より引用

「直前の副作用完了点から次の副作用完了点までの間に、
式の評価によって一つのオブジェクトに格納された値を変更する回数は、
高々一回でなければならない。
さらに、変更前の値の読み取りは、格納する値を決定するためだけに
おこなわなければならない」

と記載されいるので、

= と ++ の 2 回 head を変更しようとしているので未定義です。

参考に http://www.kouno.jp/home/c_faq/c3.html


この投稿にコメントする

削除パスワード

No.22565

ありがとうございました
投稿者---CENTER(2005/08/10 22:06:23)


まきじ様、かずま様、YuO様επιστημη様、とおり様、Hermit様

お忙しい中、お答えいただきありがとうございました。

かずま様これからきちんと本の名前は書きます。
ご指摘感謝します。

他の質問があるのですが、新たにスレたてます。


この投稿にコメントする

削除パスワード

No.22568

Re:ありがとうございました
投稿者---RiSK(2005/08/10 23:15:15)


>かずま様これからきちんと本の名前は書きます。

今回の引用元は?


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧