• 締切済み

自己参照構造体を使った2分探索用ファイル処理

大学での明日の課題なのですが、昇順にソートされている単語ファイルを2分探索できるようにツリー型に自己参照構造体に格納する方法がわかりません。構造体の配列に一度入れてからならできるのですが意味がありません。またファイル処理でソートされている単語を50音順に読んでくるので、自己参照構造体に入れる順序が複雑になります。最初にある単語をキーにするとただの長い構造体になってしまいます。説明不足かも知れませんがよろしくお願いします。 <構造体の宣言> struct dictionary{ char *tango struct dictionary *small; struct dictionary *big; } 構造体の中身の順[]内はデータの読み込む順     [0]     /   [1]   / \ [3]   [2]  \    [4]   \   /    \[5]      \[6]

みんなの回答

noname#18290
noname#18290
回答No.2

適切なルートキーを探し、 最適な二分探索木を再構築せよと言う 仮題だとは思いますが、今日あたりか 次回の授業で平衡木を習うでしょう。 この手の質問は、こういう場所には不適切と思います。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「構造体の配列に一度入れてからならできる」というのであれば, そうすればいいんじゃないでしょうか? もちろん, 「そのようなことをしてはならない」と課題に書いてなければ, ですが. 実際, データ量がわからないと面倒なんですが.

関連するQ&A

  • 構造体のソートの記述について

     C言語で自己参照構造体(beforeとnextで繋げてます)で名簿をつくり、年齢で昇順ソートをしようと考えています。  そこで、ソート関数の「qsort」というものを使ってソートしたいのですが、どのように使ったらいいのでしょうか?  参考例などがありましたら、教えていただけますか?  よろしくお願いします。

  • 自己参照型構造体とソート

    現在C言語の自己参照型について勉強をして入るのですが mallocで確保した領域でソートを行うにはどのようにすれば 良いのでしょうか。 (qsort関数は使わず、独自の関数で行う) *図 -database |number |name |next----batabase _____________|number _____________|name _____________|next------と続く ソースコード #include <stdio.h> struct database{ int number; char f_name; struct *next; }; int data_sort(){ /* ここのやり方がWebを見ても理解が出来ない状態です。 */ } int main(){ struct database *d1,*d2; d1 = (struct database *)malloc(sizeof(struct database*)) d2 = NULL; while(cnt < 10){ scanf("%d",&d1->number); scanf("%s",d1->name); d1->next = d2; d2 = d1; cnt++; } data_sort(); }

  • void型のポインタで構造体の参照

    void型のポインタで構造体や共用体を参照することはできますか? void *p=&kou; struct KOU kou; (struct KOU*)kou.name="名前"; のようにして構造体を参照しようとしたのですが、「左側が構造体又は共用体ではありません。」と出ます。型キャストはコンパイラに型を知らせるだけのものなのでコンパイラが構造体の型を知ることができない、ということでしょうか?void型のポインタを使って構造体(共用体)を参照することはできますか?回答よろしくお願いします。

  • 自己参照構造体が美しいと感動するのはなぜ?

    「日経BPパソコンベストムック 矢沢久雄セレクション アルゴリズム&デザインパターン」のP12において >筆者はこれを知ったとき、自己参照構造体を考えた人は頭がいいなぁ、美しいなぁと感動しました。 と書かれており、さらに >短いコードが、ゴールに達した人に授与される金メダルのように見えませんか。 と書かれておりますが、こんな概念が、感動すると思いますか? こんなものに感動するのはこの本を執筆した著者だけだと思いますが、どうなんでしょうか? 自己参照構造体に感動する人なんかいるのでしょうか? プログラマーの方、回答のほうお願いします。

  • 構造体配列のクイックソート

    こんにちわ。 構造体配列のリストを ポインタのつなぎ変えによるクイックソートで 以下のようなソートをしたいのですが、悩んでおります。 struct info { int count; struct info *prev; struct info *next; }; int main () { struct info info[5]; /* 初期値設定 */ quick_sort(info, 0, 5); return 0; } 上記のようにして、クイックソートをしたいのですが、 よくあるクイックソートだと 例えば初期値を <配列のindex>要素の値を <0> <1> <2> <3> <4> 5 1 4 3 2 などと定義した場合 普通のクイックソートだと <0> <1> <2> <3> <4> 1 2 3 4 5 というように並び変えられてしまい <配列のindex>と 要素の値の組み合わせが変わってしまいますが、 この組み合わせを変えず、 struct info *if; if = info; for (i=0; i<MAX; i++){ printf("%d", if->count); if = if->next; } printf("\n"); とすることで、indexとしては昇順になっていないが *nextをたどっていくことでちゃんと目的の値の昇順になっている というのを実現したいのですが、ポインタのつなぎ変えか何かが 間違っているようで うまいことできていません。 どなたかご教授いただけますでしょうか。 申し訳ありませんが、よろしウお願いいたします。

  • 自己参照構造体のtypedef宣言とスコープ

    MinGWとgccでプログラムを組んでいます(OSはWin7です)。 main.cpp、variable.h、function.hの3つのファイルからなり、 variable.hで自己参照構造体とそれのtypedef宣言をしています。 以下のような感じです。 ************************* typedef struct hoge HOGE; struct hoge{ int a,b; double x,y; HOGE *p1, *p2; } ************************* そのあとfunction.hでこのHOGE型のポインタを受ける関数を宣言しています。 void hogehoge(HOGE *p1, HOGE *p2); これをmain.cpp内で、variable.h、function.hの順に読み込んでいます。 そして、コンパイルエラーがでます。 error: unknown type name 'HOGE'(これがずらっと) typedefのスコープの関係なのか、それ以外の問題なのか。 煮詰まっています。アドバイスお願いいたします。m(_ _)m

  • C言語 自己参照型 複数木構造

    C言語の自己参照型を使用しプログラムを作ろうとしていますが、 2分探索木についての解説、サンプルをのせているサイトは たくさんあり勉強になったのですが、 木が2以上の複数の場合になった場合、どういったプログラムをくめば いいのかわからず、学習したいと思っています。 参考となる、サイト、サンプルを教えていただけないでしょうか? //2分木の場合 struct node{ int nodeID; struct node *nextA; struct node *nextB; } //複数木の場合? struct node{ int nodeID; struct node **next; } のように複数木の場合は、次の木が複数に対応できるように ポインタのポインタを使用するのかと思いますが、 構造体のメンバでポインタのポインタの使用の仕方が いまいち理解できませんでした。 よろしくお願い致します。

  • ファイルから読みこんで構造体に格納する、

    shohinというファイルに RX-100 odango_tsumeawase 3000という のが 五行ならんでいるのですが、 これを読み込んで struct shohin{ char code[10]: char name[40]; int price; } にファイルから読みこんで構造体配列に 格納したいのですが、構造体配列に格納する やりかたがわかりません。 構造体配列は struct shohin list[];というのを宣言しています。 ファイルから一行読み込んで fprintf()を使おうと思うのですが、 それはできますか? メンバ毎に格納したいのですが、 それがわかりません お願いします。

  • 条件によって構造体のリスト構造を変えたい

    こんにちは。 C(C++)で構造体を使っているのですが、まだまだ未熟で使い方が良く分かりません。以下のことを実施したいのですが、やり方をどなたかご教授頂けませんでしょうか。よろしくお願いします。 条件によって構造体のリスト構造を変えたいのです。 例えば、 条件1の場合は 構造体a→構造体b 条件2の場合は、 構造体a→構造体c 上記のようにです。そして構造体のルートから参照先をたどっていくことで、配下の構造体の値を取得したいのです。 文法上許されないようですが、イメージとしては、 struct a aa; aa.c->b.aa ということをしたいのです。よろしくお願いします。 struct a{ char a; char b; struct c; : }; struct b{ char aa; : }; struct c{ : : };

  • 構造体のリストをソートしたい。

    ある名簿のリストを作りました。 以下のような構造体で、 typedef struct meibo{ char name[10]; int old; struct meibo *next; }MEIBO; これを、ポインタp->next->nameをたどっていって、名前が辞書順になるようにリストを作ったのですが、 これを年齢順にソートして表示させたいんです。 どんな方法があるんでしょうか? 一旦すべてを配列に格納して、クイックソート…とかも考えたのですが、すごく領域をとるし、なんか2度手間(最初から配列に順に格納していけばよかったなぁ・・・と。 それでもやっぱり最初から名列順にするときから配列に入れておくほうがいいのでしょうか? 教えてください。 (最初から年齢を比較してリストを作れば・・ってのはなしで、名列順のリストが存在するものとしてください。)

専門家に質問してみよう