ウォーターサーバーとコーヒーマシンが一体化した画期的マシン >>

--(装置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)のつながりの両方に対応する(分岐のある構造にも対応する)
ためには、どのようなつくりにすればよいでしょうか?

できれば、サンプルなどでおしえていただけますとありがたいです。

よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

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;

とか。
    • good
    • 0

分岐の分だけポインタを持てばいいだけです。


具体例は既に出た通り。

余談になりますが
例示された様な、枝分かれする(合流しない)構造は「木」(tree)と呼びます。
木を使ったプログラムも参考にしましょう。
    • good
    • 0

struct device {


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

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qbreak文でループを一気に抜けるには

break文でループを一気に(2個以上)
抜けたい場合はどのようにすればいいのでしょうか?
たとえば下のプログラムで1から2に抜けたい
すなわちifとforの2つの中括弧を同時に抜けたい場合には
どうやってbreak文を記述すればいいのでしょうか?
(goto文は使わないということでお願いします。

int k=0;
int i;

for (i=1;i<10;i++){
  k++;
  printf("%d",k);
  if (k == 5){
    printf("a");
    break;・・・・・・・・・1→
  }
}
printf("finish");・・・・・・・・・2←

Aベストアンサー

No.2 です。

> for文を2つ一気に抜ける場合にはどうしたらいいんでしょうか?

この場合は、素直に goto 文を使うか、No.1 さんのようにフラグで制御するしかないでしょう。

私はC言語実務経験20年以上ですが、goto 文について言えば、「無闇やたらに使うべきではないが、使うべき所で使うのをためらってはいけない」ということです。
よく、「何が何でも絶対に goto は使うな!」と言う人がいますが、これは間違っています。
たった1個の goto 文を避けるために、フラグなどを組み合わせて複雑怪奇な構造にすることの害の方が、余程大きいです。

Q馬鹿でもわかるようにダブルポインタを教えてください

題名のとおり↑

本当に、丁寧にサルでも犬でもキジでも桃○郎分かる説明をお願いします。

お願いします!!

Aベストアンサー

#1のzwiです。
ダブルポインタを使うときは、たいてい呼ばれた関数側でポインタを書き換えたいときに使います。

現状で、こういう状態だったとき、
(1)正面「右を見ろ→」←**パラメータのポインタポインタ変数
(2)右「下を見ろ↓」←*ポインタ変数
(3)下「ば~か。」←変数
で(2)を書き換えます。
書き換え後
(1)正面「右を見ろ→」←**パラメータのポインタポインタ変数(書き換えても呼び元には返せない)
(2)右「上を見ろ↑」←*ポインタ変数(呼び元のポインタ変数そのもの)
(3)上「お疲れ!」←変数
で参照する変数が変わることになります。

関数のパラメータを書き換えても呼び元には反映されないのは理解されていると思いますが、シングルポインタがパラメータだとそのポインタ自身は書き換えて返すことが出来ませんよね?ダブルポインタは、そんなときに使います。

QC言語 配列の長さの上限

C言語で配列Array[N]の長さNの上限っていくらなんでしょうか?
もし可能なのであれば上限を2147483647にしたいのですが、方法を教えてください。

Aベストアンサー

そもそもWindowsの32bit版はアプリが仮想メモリ空間を2GBしか使えません。2GBを超えるには64bit版が必要です。
たとえ64bit版OSだとしても添え字が2147483647って、単純なintの配列だとしても4x2147483647=8GB必要ですね。実メモリ16GBとかのPCを用意しますか?
そもそも配列で2147483647個必要なアルゴリズムに問題ありだと思います。


人気Q&Aランキング