• ベストアンサー

C言語について

リストやスタック、キューなどのデータ構造をC言語で書くとき、構造体をほとんどのプログラムで使用されているのですが、それはなんのためなのでしょうか?それと、 -> このような記号で表された式、例えば q->head=0; という式を見たのですが、 この q->head は q > q - head という意味で捉えてはいけないのでしょうか?捉えていいのなら最後に0で初期化しているのがなぜかわかりません。 よろしくお願いします。

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

  • ベストアンサー
回答No.3

他の方も言ってるので、はしょりますが^^ q->head=0;  は q[0].head=0; qというポインタに、構造体内での、headの位置を加えた後 その位置ポインタの中身に対して”0”を代入。という意味です。 typedef struct { int a; int b; int c; }WAA; void hoge(void) { WAA abc[50]; WAA *p; p=&abc[20]; p->a=1; // これと、abc[20].a=1 は同じ。 p->b=2; // これと、abc[20].b=2 は同じ。 p->c=3; // これと、abc[20].c=3 は同じ。 // しかし、20番の位置を1度求めれば以後、pはずっと、abc[20]へのポインタなので高速である } ポインタを使った高速化などでは、よくこの書式を使うので、覚えておいて損はないかと。

その他の回答 (2)

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

そのようなものは、複数の値を一纏めで扱います。 例えば、単方向リストなら、 「要素の値」と「次の要素」の二つが一セットになってますよね? 構造体を使わない方法もありますが、大抵はそっちの方が複雑になります。 q->head は struct A *q ; /* qは struct Aへのポインタ */ のときに (*q).head; /* qが指し示すstruct Aの実体の head 要素 */ と同じになります。 「ポインタが示す構造体の実体の要素」というのはよく使われるので、-> という演算子で使えるようになっています。 > q->head は q > q - head という意味 この考えでいけば a <= b は a = a < b となりそうですが、そうはなっていませんよね? そんな分割して考えられるのは「代入演算子」と呼ばれる特別なものだけです。 (それも、「同等と考えられる」だけで、完全に同じものではありません) -> はこの2文字で1つの演算子です。 このあたり、まともな参考書にはちゃんと載っているはずなのですが。

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.1

>>リストやスタック、キューなどのデータ構造をC言語で書くとき、構造体をほとんどのプログラムで使用されているのですが、それはなんのためなのでしょうか? そのほうが行数が少なくなるし、結果としてコードが分かりやすくなります。 >>例えば q->head=0; という式を見たのですが、 この q->head は q > q - head という意味で捉えてはいけないのでしょうか? いけません。命令の意味が変わってしまいます。 >>捉えていいのなら最後に0で初期化しているのがなぜかわかりません。 捉えてはいけません。

関連するQ&A

  • c言語のリスト

    C言語で構造体まではどこのサイトでも乗っていますが、リスト、スタック、キュウなどのことになるのありません。どこか詳しく解説しているサイトご存じないですか?おしえてください。

  • C言語での構造体

    C言語で、 キュー構造を作りたいのですが、うまくできません。 途中まで作ったのですが、うまく動きませんでした。 EnqueueやDequeueでデータの出し入れをするのですが、そのままではデータを取り出したときにデータが先頭に来ないので、refreshで先頭に持ってくるようにプログラムを組みました。 ----------------------------------------------------- #include<stdio.h> #define MAXQUEUE 10 typedef struct queue{ int head, tail; char entry[MAXQUEUE]; } Queue; //キュー構造にデータを入れる。 void Enqueue(char item,Queue *q){ q->entry[q->tail]=item; q->tail++; } //キュー構造からデータを取り出す。 void Dequeue(char *item,Queue *q){ *item=q->entry[q->head]; q->head++; } //キュー構造内のデータを先頭にずらす。 void refresh(Queue *q){ while(q->head==0){ q->entry[q->head-1]=q->entry[q->head]; q->head--; q->tail--; } } void main(){ Queue qu; Enqueue('w1',&qu); Enqueue('w2',&qu); Enqueue('w3',&qu); Enqueue('w4',&qu); Dequeue(&qu,&qu); Dequeue(&qu,&qu); refresh(&qu); } ---------------------------------------------------------------- mainからEnqueueやDequeueを呼び出すときに、引数として何を渡せばいいのでしょうか?構造体をそのまま渡してみたのですが、「error C2664: 'Dequeue' : 1 番目の引数を 'Queue *' から 'char *' に変換できません。(新しい機能 ; ヘルプを参照) 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。」というエラーを吐いてしまいます。 分かりづらい説明で申し訳御座いませんが、ご回答宜しくお願いいたします。

  • スタック、キュー、リスト、2分木の使い道は?

    主な定番データ構造として (1)スタック (2)キュー (3)リスト (4)2分木 これらのデータ構造がありますが、特に「スタック」と「キュー」は一体何に使えるのでしょうか? 「スタック」や「キュー」は使い道が思いつかないのですが、一体何に使えるのですか? データ構造である「スタック」「キュー」「リスト」「2分木」の使い道を教えてください。 よろしくお願いいたします。

  • c言語 リストデータ構造 キュー スタック がわかりません

    ポインタを用いた線形リストデータ構造を利用して,キーボードから順に入力した複数の整数値(int型)を空の「スタック」および「キュー」にそれぞれ保存し,取り出した時,出力される整数値を順に表示するプログラム. 動作確認のために入力する整数値は,年号と月の数字の部分とせよ(2008年5月なら,「2→0→0→8→0→5」の順).また,スタックとキューに保存されているデータがどのような順で出力されるかをそれぞれ表示するようにせよ.(スタックの場合は「5→0→8→0→0→2」の順で出力され,キューの場合は「2→0→0→8→0→5」の順で出力されることを表示させ確認せよ) こうのようなプログラムを作らなくてはいけないのですが、まったくわかりません。参考にでもソースを教えていただけないでしょうか? また、詳しく解説されている(初級と中級レベルそれぞれについて)サイトや書籍がありましたらそちらもお願いいたします。

  • C言語で

    C言語で複素行列の和と積を計算するプログラムを作りたいのですが、 よくわからないので教えてほしいです。複素数を構造体で定義して、配列を使えば いいと思うのですが・・・。 ちなみに実数の行列の和と積を求めるプログラムはわかっています。

  • すみません。C言語の構造体で簡単なプログラムがあれば教えてください。

    すみません。C言語の構造体で簡単なプログラムがあれば教えてください。

  • C言語のリスト、スタック、キュー、逆ポーランド法など

    リスト、スタック、キュー、逆ポーランド法などプログラム例ののったサイト知りませんか?どうしてもわからないのですどうか教えてください。

  • C言語について

     プログラミング言語について質問があります。今、C言語を練習中ですが、C言語に関する本を見ると、大体、(入門者用の教科書しか知らないのですが)ファイル操作とか、構造体とかの説明とかで、終わっています。それで、自分はWindowsでグラフィック操作(例:動画とかを扱う)とかの、プログラムを組みたいのですが、C言語でそれができるのでしょうか。それともC++言語とか、Javaとか他の言語を習得しなければいけないのでしょうか。また、欲張りますが、C言語でグラフィック操作ができるのなら、どんな本を読めばいいのでしょうか。解らなかったので、投稿しました。よろしければ、回答宜しくお願いします。

  • C言語のポインタとスタックポインタ

    プログラム始めて1ヶ月の初心者です。 C言語のポインタとスタックポインタというのは同じなのでしょうか。 スタックポインタの考えは大体理解出来たのですが C言語のポインタとなるとコードを見てもサッパリ分かりません。 ネットで調べても出てこなかったのでどなたか教えて下さい。 よろしくお願いします。

  • C言語によるリスト構造について質問があります

    データ構造とアルゴリズム(岩波書店)という参考書のpascalのソースを元にC言語で作って来るという課題(下に書きます)が出たのですが、 手元にある参考書を見たり、インターネットで調べてもわからなかったので質問させていただきます。(ソースはすべてpascalです) 1.リストの先頭へのデータ挿入 proceder inserthead(val :datatype); var q:list; begin new(q); with q↑ do begin element:=val; next:=listhead; end; listhead:=q; end; 2.リストの先頭からデータの削除 proceder deletehead; var q:list; begin q:=listhead; listhead:=q↑.next; dispose(q); end; 3.リストを画面に出力するプログラム この3つが出題された課題です。 最初、C言語によるリストを作る方法がわからずほかの授業で使用したテキストを見てポインタと配列を使うものだと思い、それを主にインターネットなどで検索しましたが、char型の値を用いたものを出力するためのソースがありましたが、それを自分に必要なソースに書き直すことができませんでした。 LSI C-86用のCPadを使って書いていたのですが、「警告: ポインタの型が合わない (=)」や、実行できてもなぜか延々とprintf命令が実行され続け、暴走?したり自分では解決できそうにありません。 ご教授お願いします。 詳しく解説されている(初級と中級レベルそれぞれについて)サイトや書籍がありましたらそちらもお願いいたします。

専門家に質問してみよう