C言語で分岐があるリスト構造を実現する方法

このQ&Aのポイント
  • C言語で分岐があるリスト構造を実現するためには、どのような構造体を使えば良いでしょうか?装置A, 装置B, 装置Cのつながりと装置A, 装置B, 装置Eのつながりの両方に対応するための構造体の作成方法を教えてください。
  • C言語で分岐があるリスト構造を実現するためには、どのような構造体を使用する必要がありますか?例えば、装置A, 装置B, 装置Cのつながりと装置A, 装置B, 装置Eのつながりの両方に対応するための構造体の作成方法を教えてください。
  • 分岐があるリスト構造をC言語で実現するためには、どのような構造体を使うべきですか?装置A, 装置B, 装置Cのつながりと装置A, 装置B, 装置Eのつながりの両方を扱うための構造体の作り方を教えてください。
回答を見る
  • ベストアンサー

C言語 リスト構造

--(装置A)--(装置B)---(装置C)---            |            ---(装置E)--- 上の例のように途中で分岐があるリスト構造を あらわすために、C言語でどのような構造体をもつべきでしょうか? (装置A),(装置B),(装置C)のつながりだけをリスト構造で持つ場合は、 struct device { int no; char name[NAME_SIZE]; device_t *next; //次の device 構造体へのポインタ }; のような構造体を使いリスト構造にできましたが、 (装置A),(装置B),(装置C)のつながりと (装置A),(装置B),(装置E)のつながりの両方に対応する(分岐のある構造にも対応する) ためには、どのようなつくりにすればよいでしょうか? できれば、サンプルなどでおしえていただけますとありがたいです。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.1

device_t *next; だと1つしか持てないわけだから複数持てるように device_t **next; で複数持てるようにすればいいです。 仮に装置Bのdevice_tだとして next = malloc(sizeof(device_t *) * 3); next[0] = 装置C; next[1] = 装置E; next[2] = NULL; や next_num = 2; // int next = malloc(sizeof(device_t *) * next_num); next[0] = 装置C; next[1] = 装置E; とか。

その他の回答 (2)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

分岐の分だけポインタを持てばいいだけです。 具体例は既に出た通り。 余談になりますが 例示された様な、枝分かれする(合流しない)構造は「木」(tree)と呼びます。 木を使ったプログラムも参考にしましょう。

回答No.2

struct device { int no; char name[NAME_SIZE]; struct device *right; //右の device 構造体へのポインタ struct device *bottom; //下の device 構造体へのポインタ };

関連するQ&A

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

    こんにちは。 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{ : : };

  • C言語 list 構造体配列

    どうしてもこの問題がわからないので教えてください!  下記の構造体タグ「seiseki」を使って,表に示すデータをもつ構造体配列「list」を作成する.  関数に構造体配列「list」のアドレスを渡す.  関数で構造体ポインタ「*list」を利用して,一番点 数の高い者(1名限定)を調べ,その名前を表示する. struct seiseki{ char name[30]; int score; name score }; 表 佐藤 80 鈴木 75 田中 95 高橋 90

  • C言語 構造体配列 list

    プログラミングでこの問題がわからないので教えてください! 下記の構造体タグseisekiを使って,表に示すデータをもつ構造体配列listを作成する. 構造体配列listを利用して,一番点数の高い 者を探し,その名前を表示する. struct seiseki{ char name[30]; int score; name score }; 表 佐藤 80 鈴木 75 田中 95 高橋 90

  • リスト構造の設定のしかた

    メンバ変数が配列のlist_before構造体に設定してあるものを、リスト構造のlist_after構造体に設定し直したいです。 どのように設定すればいいのでしょうか? また、list_before構造体とlist_after構造体を引数にした関数で設定したいのですが呼び出し元と先の引数はどう書けばいいのでしょうか? その際の構造体とメンバ変数は以下になります。 ご教授どうぞ宜しくお願いいたします。 struct list_before { char *name[5]; int size[5]; }; struct list_after { char *name; int size; struct list *next; };

  • C言語初心者です。

    C言語初心者です。 構造体について勉強してるのですが、不明点があるため質問させて頂きます。 ---------------------------------- struct A{ int (*a)(struct B, struct C); int (*b)(struct B, struct C); } ---------------------------------- 上記の処理(構造体の中身)の書式について、書籍などで調べたのですが分かりません。 何を意味しているのでしょうか? ご回答のほど、よろしくお願いします。

  • C言語の構造体のサイズについて

    いつもお世話になっていります。 早速ですが、C言語の構造体のサイズについて教えてください。 typedef struct B { short code; char name; float price; } B; typedef struct A { B bbb[10]; double sougaku; } A; A aaa; といった構造体があった場合に、 sizeof(aaa.bbb.code) + sizeof(aaa.bbb.name) + … + sizeof(aaa.sougaku) という風に一つ一つサイズを取得し、合計して構造体のサイズを取得した場合と sizeof(aaa) という風に構造体のサイズを取得した場合のサイズの値が異なるといった現象が起きます。 その原因が分からなくて困っております。 そこで考えられる要因をお教えください。 因みに実際の構造体はサイズで言えば2500バイトくらいあります。 froat/char/double/short 型を使用しております。 よろしくお願いします。

  • C言語での構造体

    C言語の構造体で配列を扱うとき、 struct ○○{  char ○○[○] とすれば出来ますが、同じようにして構造体で二次元配列を扱うことは出来ますか? 一度組んでみたのですが、 #include<stdio.h> struct aaa{ int no; char name[128]; char y_name[128]; char n_name[128]; char s_name[128][128]; }; int main(void){ int i; struct aaa iryo[99]; printf("入力前\n"); /* 構造体配列に scanf()でデータを入力 */ for(i = 0; i < 3; i++) { // printf("input...\n"); scanf("%d", &iryo[i].no); scanf("%s", iryo[i].name); scanf("%s", iryo[i].y_name); scanf("%s", iryo[i].n_name); scanf("%s", iryo[i].s_name); } printf("入力後\n"); printf("出力前\n"); /* 入力データの確認 */ for(i = 0; i < 3; i++) { printf("番号:%02d 内容:%s Y分岐:%s N分岐:%s 他分岐:%s\n", iryo[i].no, iryo[i].name, iryo[i].y_name, iryo[i].n_name, iryo[i].s_name); } printf("出力後\n"); printf("%d",sizeof(struct aaa)); return 0; } としたら、エラーは出ませんが、実行すると何も表示されませんでした。

  • C言語の構造体についてなんですが。

    struct LIST {     struct Num* number;     struct LIST* next;/* 次の要素へのポインタ */ }*root; struct Num{     int a;     struct Num* next; /* 次の要素へのポインタ */ }*numroot; と構造体を定義したときに、 main(){     struct LIST *p;     for(p = root; p != NULL; p = p->next) ; } とすれば、pの先頭からNULLまでを参照していくことは分かるんですが、pのnumberの先頭からNULLまでの参照方法(プログラムのfor文の記述方法)がイマイチわかりません。つまり、構造体の構造体をどのように参照するかということです。 これを実現したい理由は、構造体内での数の格納を配列(固定長)ではなく可変長で格納したいからです。 分かる方は解答をお願いします。

  • C言語の構造体について

    構造体を勉強している所なのですが変数をまとめられるのは分かりましたがどのサイトを見てもいまいち使い所がわかりません。 struct test { int a; int b; int c; }testtest; testtest.a = 0; testtest.b = 1; testtest.c = 2; 例えば上記のような構造体を作成するとします。 私の見たサイトでは構造体で宣言はまとめられても初期化する事はできないと書いてありました。 下記のように変数を普通に宣言&初期化するよりも手間がかかってしまっていると思うのですが私の考えが及ばない何か別の使い方または処理が早くなったりする事があるのでしょうか?。 int a = 0; int b = 1; int c = 2;

  • 固定長レコードから構造体について_C言語

    固定長レコードから構造体について フラットファイルから固定長のレコードを取得して 構造体に格納する。 という内容なんですが、構造体指定バイトのデータを格納して 求めている結果が... kozo_a:aaaaa kozo_b:bbbbb kozo_c:ccccc となって欲しいのですが、 構造体の確認をしてみたところ... list[0]: kozo_a:aaaaabbbbbccccc kozo_b:bbbbbccccc kozo_c:ccccc list[1]: kozo_a:aaaaabbbbbccccc kozo_b:bbbbbccccc kozo_c:ccccc list[2]: kozo_a:aaaaabbbbbccccc kozo_b:bbbbbccccc kozo_c:ccccc list[3]: kozo_a:aaaaabbbbbccccc kozo_b:bbbbbccccc kozo_c:ccccc のように、求めている結果と異なってしまいます。 未だ問題解決しておらず、誰かお力を貸して頂けないですか? ~input(ファイル名)~ 01:aaaaabbbbbcccccdddddeeeeefffff 02:aaaaabbbbbcccccdddddeeeeefffff 03:aaaaabbbbbcccccdddddeeeeefffff ~ソース~ /*test.c*/ /********************************/ /* include */ /********************************/ #include <stdio.h> /********************************/ /* マクロ */ /********************************/ #define FILE_NAME "input" /* 入力ファイル名 */ #define LISTMAX 5 /* レコードMAX件数 */ #define MAX_LEN 128 /* 1行の最大文字数 */ /* 入力ファイルカラム定義 */ #define colum_a 5 #define colum_b 5 #define colum_c 5 #define colum_d 5 #define colum_e 5 #define colum_f 5 /********************************/ /* 宣言 */ /********************************/ int i=0; /* カウンタ */ FILE *fp; /* FILEポインタ */ char buff[MAX_LEN]; /********************************/ /* 構造体 */ /********************************/ struct shohin { char kozo_a [colum_a]; char kozo_b [colum_b]; char kozo_c [colum_c]; char kozo_d [colum_d]; char kozo_e [colum_e]; char kozo_f [colum_f]; }; struct shohin list[LISTMAX]; /********************************/ /* メイン処理 */ /********************************/ int main(void) { /********************************/ /* ファイルオープン */ /********************************/ fp=fopen(FILE_NAME,"r"); /********************************/ /* データ入力処理 */ /********************************/ while(NULL!=(fgets(buff,MAX_LEN,fp))) { if(i==LISTMAX) { /* レコード件数がLISTMAX(5)を超えた時 */ printf("確保した以上にデータがあります\n"); break; } sscanf(buff,"%s %s %s", list[i].kozo_a, list[i].kozo_b, &list[i].kozo_c); printf("list[%d]:\n\tkozo_a:%s\n\tkozo_b:%s\n\tkozo_c:%s\n", i, list[i].kozo_a, list[i].kozo_b, list[i].kozo_c); i++; } fclose(fp); } //▲▲▲▲▲▲▲▲▲▲▲▲▲▲ //最終的に私が求めているのは、 //あるファイルのデータから、nバイト目~nバイト目を //構造体を用いて判定して、その部分の指定データを置換(変換)する。という課題です。 //イメージ //変換前:aaaaaBBBBBcccccddddd //変換後:aaaaabbbbbcccccddddd //行き詰ってしまい先が見えません…お力を貸してください!