隣接リスト表現を用いた配列についての質問です。 struct node { int eki, rosen; float kyori; struct node *next; };で定義し、
隣接リスト表現を用いた配列についての質問です。 struct node { int eki, rosen; float kyori; struct node *next; };で定義し、 次の関数 void add_edge(struct node *adjlist[], int eki1, int eki2, int rosen, float kyori) を実装しようとしています。これは隣接リスト表現adjlistに駅番号eki1から駅番号eki2への情報(路線番号rosen,距離kyori)を追加するものです。 これの中身を struct node *p; struct node *s; p = adjlist[eki1]; s->eki = eki2; s->rosen = rosen; s->kyori = kyori; s->next = p; adjlist[eki1] = s; としたところ、うまくいきませんでした。どのような形で追加すればよいのでしょうか。プログラム全文は以下の通りでいじる箇所はadd_edge内のみです。 #include<stdio.h> #include<stdlib.h> char buf[256]; struct node { int eki, rosen; float kyori; struct node *next; }; void add_edge(struct node *adjlist[], int eki1, int eki2, int rosen, float kyori) { struct node *p; struct node *s; p = adjlist[eki1]; s->eki = eki2; s->rosen = rosen; s->kyori = kyori; s->next = p; adjlist[eki1] = s; } void print_adjlist(struct node *adjlist[], int n) { int i; struct node *p; for(i=0;i<n;++i) { printf("%d:", i); p = adjlist[i]; while(p!=NULL) { printf(" (%d,%d,%.3f)", p->eki, p->rosen, p->kyori); p = p->next; } printf("\n"); } return; } int main() { int eki1, eki2, rosen, ekisu, i; float kyori; scanf("%d ", &ekisu); struct node *adjlist[ekisu]; for(i=0;i<ekisu;++i) adjlist[i] = NULL; while(fgets(buf,sizeof(buf),stdin)!=NULL) { if(buf[0] == '\n'){ break; } sscanf(buf, "%d:%d:%d:%f ", &eki1, &eki2, &rosen, &kyori); add_edge(adjlist, eki1, eki2, rosen, kyori); } print_adjlist(adjlist, ekisu); return 0; }
実行例は次の通りです。 入力 3 0:1:1012:2.000 0:2:1023:4.000 1:2:1014:3.000 出力 0: (2,1023,4.000) (1,1012,2.000) 1: (2,1014,3.000) (0,1012,2.000) 2: (1,1014,3.000) (0,1023,4.000)
ベストアンサー
初期化はどのようにすればよいのでしょうか。 struct node *s = NULL; としたり、 s-\u003eeki = 0; s-\u003erosen = 0; s-\u003ekyori = 0; とするとsegmentation fault となってしまうのですが。
質問者からのお礼コメント
分かりやすすぎる説明ありがとうございました!
お礼日時:1/27 10:03