質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1680閲覧

隣接リストLを作成するプログラムについて

txty

総合スコア303

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/09/04 15:32

編集2020/09/08 07:52

c

1 2#define N 100          /* グラフの点の数を最大100個まで */ 3 4 struct LIST         /* リストという構造体の宣言 */ 5{ 6 int v_num;         /* 点の番号 */ 7 struct LIST *next;     /* 次の構造体を指すポインタ */ 8 }; 9 10 struct LIST *vertex[N+1];  /* LIST型のポインタ配列の宣言 */ 11 12 13 int main(void) 14 15{ 16 struct LIST *tmp; 17 18 int number; int degree; 19 20 scanf("%d",&number);   /* 点数の読み込み */ 21 22 for(int i=1;i<=number;i++){ 23 24 vertex[i]=NULL;   /* 配列の初期化 */ 25 26 scanf("%d",&degree); /* 各点の次数の読み込み */ 27 28 for(int j=1;j<=degree;j++){ 29 30 tmp=(struct LIST*)malloc(sizeof(struct LIST)); /* 領域の確保 */ 31 32 scanf("%d",&(tmp->v_num));         /* 隣接点の読み込み */ 33 34 tmp->next=vertex[i]; 35 36 vertex[i]=tmp; 37} 38} 39 40}

freeされてないのも気になるんですが、グラフ理論入門という古本です。コード
はあまりのってないんですがリストや樹形図を勉強したいです。見ても頭にはいってこない構文なので
よくわからないです。読むのを手伝ってほしいです。わかるのは、アロー演算子は、アドレス->構造体の中身をみているってことぐらいです。struct LIST *vertex[N+1];からわかりません。

(本に記載されているソースコードの説明と図を後で追記します。)よろしくお願いします。

イメージ説明 汚い字ですいません

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2020/09/04 15:42

> 読むのを手伝ってほしいです。 なにすりゃいいですか?
txty

2020/09/04 15:54 編集

わたしもそれ思いました。明日コメントと図を載せるので、うまくいくか分かりませんが、読解してほしいです。図だけでも、わかりそうなのですが、うまく理解できるかわからないので。できれば1文1文とお願いできると幸いです。まあ明日です。
episteme

2020/09/04 22:54

>できれば1文1文とお願いできると幸いです。 それは「僕の代わりに教本を読んでください」とお願いするに等しくはないですか? (やだよそんなの)
txty

2020/09/04 23:46 編集

そうですか。それなら受けたことないけど学校の先生みたく一方的に勝手に解釈つけてくれるのはどうでしょうか。とりあえず図をのせます。字は汚いですけど。つながっていくというイメージがわかりません。
txty

2020/09/04 23:26

struct LIST *vertex[N+1];  /* LIST型のポインタ配列の宣言 */は図でいうv1、v2、v3、v4が101個あるということでよろしいでしょうか。個人的にはstruct LIST *vertex[N]でよい気がしますがなぜN+1なんでしょうか。
txty

2020/09/04 23:59 編集

struct LIST *tmp; int number; int degree; /*scanf("%d",&number);   /* 点数の読み込みがわかりません。 */ int degreeは深さ。*/ がわかりません。
txty

2020/09/05 01:31 編集

tmp=(struct LIST*)malloc(sizeof(struct LIST)); /* 領域の確保 */ scanf("%d",&(tmp->v_num));         /* 隣接点の読み込み */ は新しいメモリを確保してかえってきたアドレスから scanf("%d",&(tmp->v_num));新しいメモリに新しい番号を入力させている。と思う。 その後の tmp->next=vertex[i]; vertex[i]=tmp;はなんでしょうか。
txty

2020/09/07 10:02

epistemeさん、kazuma-sさん、丁寧な回答ありがとうございます。とりあえず、即答を避けて保留させてください。2、3日 あけます。忘れたころにコメントすると思います。
coco_bauer

2020/09/08 12:23

まずは、初心者向けのC言語の本を熟読するのが良いのではないでしょうか? C言語で書かれたプログラムを読むのに必要なC言語の文法の知識が絶望的に不足しているように思われます。 このロシア語の本を読むのを手伝ってほしいんです。ロシア語の事は何も知らないんですけど、、、というような理不尽な要求のたぐいではないですか?
txty

2020/09/08 12:48 編集

(リストと木構造を理解したいのですが)、それ以前だとすると、(初心者向けだとすると)何をすれば(どんな本を読めば)(変な本にあたると困るため)いいでしょうか。手元で役に立ってるのはcプログラミング、株式会社インフォテックサーブと職業プログラマー入門レッドフォックス株式会社ぐらいですが、リストや木構造は早かったでしょうか。
txty

2020/09/08 14:02 編集

隣接じゃなくて、普通のリストを選ぶべきでした。しまえるデータがint 型であったので気にいったのですが。あと、ベストアンサーはずすのはどうすればよかったのですか。(ミスしてたら嫌なので)まだ聞きたいです。たしかに、読めても書くのは無理かもしれないです。
guest

回答2

0

ベストアンサー

struct LIST vertex[N+1];  / LIST型のポインタ配列の宣言 */
は図でいうv1、v2、v3、v4が101個あるということでよろしいでしょうか。

YES. vertex[0]~vertex[100] を用意しています。

個人的にはstruct LIST *vertex[N]でよい気がしますがなぜN+1なんでしょうか。

vertex[0]を使っていないから。

int number; int degree;
scanf("%d",&number);   
点数の読み込みがわかりません。

なにがわかりませんか?

tmp=(struct LIST*)malloc(sizeof(struct LIST)); /* 領域の確保 /
scanf("%d",&(tmp->v_num));         /
 隣接点の読み込み */
は新しいメモリを確保してかえってきたアドレスから
scanf("%d",&(tmp->v_num));新しいメモリに新しい番号を入力させている。と思う。

YES. struct LIST 領域を確保し、そのメンバ v_num に入力値をセットしています。

その後の
tmp->next=vertex[i];
vertex[i]=tmp;
はなんでしょうか。

あなたの描いた絵のとおり、 struct LIST を数珠繋ぎにしています。

投稿2020/09/07 06:10

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

txty

2020/09/08 07:00

struct LIST *vertex[N+1];  /* LIST型のポインタ配列の宣言 */がそもそもわからなかったのですが struct LIST *vertex ポインタを[N+1]個用意したであってるでしょうか。 次に、scanf("%d",&number);でソースコードの結果から、ポインタ配列の個数を用意してるようですが、ソースコードを見た感じではそのような印象をうけなかったのですが、  このnumberは、もしかして0?,1?から100まで限定で、使う数を限定しているということであってるでしょうか。(今、おもったんですが。)、後0を使わなかったのはなぜでしょうか。 その中でdegree深さの数だけメモリをmallocで用意していて、 残りのtmp->nextはその時点の構造体のポインタをあらわしているとおもいますが、 vertex[i];と vertex[i]=tmpが謎です。 つなぐは、なぜこうなるのかよろしくお願いします。間違っている点があったら、ご指摘ください。なんか読みずらくてすいません。
episteme

2020/09/08 07:18 編集

> struct LIST *vertex ポインタを[N+1]個用意したであってるでしょうか。 ok. > scanf("%d",&number);でソースコードの結果から、ポインタ配列の個数を用意してるよう > ですが、ソースコードを見た感じではそのような印象をうけなかったのですが、 number個のポインタ: vertex[1]~vertex[number] を「使用する」です。 > 後0を使わなかったのはなぜでしょうか。 知りません。使いたくなかったからでしょう。 > つなぐは、なぜこうなるのかよろしくお願いします。 わからないにもかかわらず、その絵が描けたのはなぜですか? 理解できません。 tmp->next = vertex[i] により、tmpの次はvertex[i]が指しているLIST vertex[i] = tmp により、vertex[i] にはtmpが指しているLIST となります。 なので たとえば 1 2 3 と入力されれば vertex[i]から順番に 3→2→1 とつながります。 > なんか読みずらくてすいません。 そう思うなら修正しましょう。
txty

2020/09/08 08:52 編集

(絵は本に載ってました。文字が小さかったので自分で同じ絵を書きました。) tmp->nextはアドレスだから、struct LIST *vertex[i]のアドレスはvertex[i]でしょうか。 (人によって違うとおもいますが、アドレスをどうやって覚えてるのでしょうか) 図によると vertex[i]は縦列のようですが自分は図を見て右に繋ぎたいです。ソースコードをみるとvertex[i]を渡したことでつなげている気もします。どちらの認識が正しいのでしょうか。 struct LIST * vertex[i]について、わたしは間違えているかもしれません。この文を真に受けないでください。
episteme

2020/09/08 12:03

> 自分は図を見て右に繋ぎたいです。 tmp->next=vertex[i]; vertex[i]=tmp; これで右に繋いでます。
txty

2020/09/08 14:06 編集

すいません右に繋いでるという認識しかできませんでした。もうひとつ尋ねますが、図でいう v1,v2...はどうやってつくったのでしょうか。
txty

2020/09/08 12:49 編集

聞きすぎました。でも追記はお願いしたいです。
episteme

2020/09/08 16:40

何を問うているのかわかりません。
txty

2020/09/09 01:51 編集

struct LIST *vertex[N+1];  /* LIST型のポインタ配列の宣言 */は、縦列ですか。横列ですか。
episteme

2020/09/09 02:11

↑あなたの描いた絵のとおりですが。
txty

2020/09/09 02:20 編集

絵が理解できなくて、ちょっと混乱しています。実際のポインタ配列 vertex[N]の記述が離れているのでどっちにも見えます。しいて言えば縦列のように見えますが。どうなのでしょう。
episteme

2020/09/09 02:22

V1, V2, ... Vn を vertex[1], vertex[2], ... vertex[n] と読み替えるだけちゃいますか?
txty

2020/09/09 03:47 編集

そうだと思います(自分の認識が間違えてるかもしれませんが。追記:念のため)図でいう縦列でしたか。これで大体全体像が把握できました。後は、ばらして分析してみます。有り難うございます。長らく失礼しました。
guest

0

インデントがグチャグチャで、コードが読みにくくて仕方ありません。
読み込んだデータを表示しないと正しいどうか確かめられません。
次のように書いてみました。

C

1#include <stdio.h> // scanf, printf 2#include <stdlib.h> // malloc 3 4#define N 100 5 6struct LIST { 7 int v_num; 8 struct LIST *next; 9}; 10 11struct LIST *vertex[N + 1]; 12 13int main(void) 14{ 15 struct LIST *tmp; 16 int number; 17 int degree; 18 19 scanf("%d", &number); 20 for (int i = 1; i <= number; i++) { 21 vertex[i] = NULL; 22 scanf("%d", &degree); 23 for (int j = 1; j <= degree; j++) { 24 tmp = (struct LIST *) malloc(sizeof(struct LIST)); 25 scanf("%d", &(tmp->v_num)); 26 tmp->next = vertex[i]; 27 vertex[i] = tmp; 28 } 29 } 30 31 for (int i = 1; i <= number; i++) { 32 for (tmp = vertex[i]; tmp != NULL; tmp = tmp->next) 33 printf(" %d", tmp->v_num); 34 printf("\n"); 35 } 36}

実行例

text

13 22 11 22 34 33 44 55 66 41 77 (ここまでが入力) 5 22 11 (ここからは出力) 6 66 55 44 33 7 77

投稿2020/09/04 15:54

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

txty

2020/09/04 16:07

ありがとうございます。インデントの整形を理解してないのですが、スペースで4つでしょうか。後、printfを入れたかったのですが、どこにどうやっていれればいけないのかわからなくて明日もコードいれられるか自信がないです。ちょっと入力練習しておきます。
txty

2020/09/04 17:55 編集

```plain text 2 4 55 66 77 88 2 55 88 出力 88 77 66 55 88 55 使い方だけ覚えたのでメモしておく ```
txty

2020/09/08 06:03

調べた結果、自分は、ネスト構造は半角スペース2字、処理改行は半角スペース4字にしようと思います。(間違えたらすいません。)printfありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問