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

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

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

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

Q&A

0回答

597閲覧

Node構造体の問題

rft3

総合スコア7

C

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

0グッド

0クリップ

投稿2020/06/14 15:52

C言語のNode構造体の勉強をしています。いくら考えてもこの問題が分かりません。どうかご教授お願いします。

distance.cに対して,
degV, adjM, namesの代わりに
Nodeのメンバ変数degree, adj_nodes, nameを
用いたプログラムに修正せよ.
それに伴い,calc_distance関数の引数やキューの
要素をNode構造体へのポインタとせよ.

改良箇所の詳細
[distance.c]

  1. includeするヘッダの変更

⁃ read_graph.h → graph_struct.h
2. calc_distance関数の引数
⁃ int → Node構造体へのポインタ
3. calc_distance関数内の変数

  1. disV配列の添え字 → メンバ変数id-1
  2. degV → メンバ変数degree
  3. adjM → メンバ変数adj_nodes
  4. node, adj_node:int型 → Node構造体へのポインタ
  5. print_distance関数内

⁃ fprintfのnames → メンバ変数name

[queue.h]

  1. 構造体定義内

⁃ int型配列arr → Node構造体へのポインタの配列
2. init_queue内 arrの領域確保
⁃ int型配列arr → Node構造体へのポインタの配列
3. enq関数の第2引数
⁃ int型変数 → Node構造体へのポインタ
4. deq関数の戻り値
⁃ int型変数 → Node構造体へのポインタ

distance.c

#include <stdio.h> #include <stdlib.h> #include "read_graph.h" #include "queue.h" int *disV; //距離ベクトル Queue queue; //幅優先探索用のキュー void init_value(){ init_queue(&queue, N); disV = (int *) malloc(sizeof(int)*N); } int calc_distance(int origin){ queue.first = queue.last = 0; enq(&queue, origin); for(int i = 0; i < N; i++) disV[i] = -1; disV[origin] = 0; int maxD = 0; //最大距離 for(int d = 0; ; d++){ int h1 = queue.first, h2 = queue.last; for(int h = h1; h < h2; h++){ int node = deq(&queue); for(int k = 0; k < degV[node]; k++){ int adj_node = adjM[node][k]; if(disV[adj_node] == -1){ disV[adj_node] = d+1; enq(&queue, adj_node); } } } if(queue.first == N || queue.first == queue.last){ maxD = d; break; } } return maxD; } void print_distance(char *fn, int D){ FILE *fp = fopen(fn, "w"); int *hashV = (int *) calloc(D+1, sizeof(int)); for(int i = 0; i < N; i++) hashV[disV[i]] += 1; int **hashM = (int **) malloc(sizeof(int *)*(D+1)); for(int d = 0; d <= D; d++) hashM[d] = (int *) malloc(sizeof(int)*hashV[d]); for(int d = 0; d <= D; d++) hashV[d] = 0; for(int i = 0; i < N; i++){ int d = disV[i]; hashM[d][hashV[d]++] = i; } for(int d = 0; d <= D; d++){ fprintf(fp, "d=%d (%d駅)\n", d, hashV[d]); for(int j = 0; j < hashV[d]; j++) fprintf(fp, "%s ", names[hashM[d][j]]); fprintf(fp, "\n-----------------------\n"); } fclose(fp); } int main(int argc, char *argv[]){ read_matrix(argv[1]); //N, degV, adjMを設定 read_names(argv[2]); //namesを設定 init_value(); //外部変数の初期化 int origin = atoi(argv[3])-1; //起点ノード int maxD = calc_distance(origin); printf("%d\n", maxD); // print_distance(argv[4], maxD); }

queue.h

typedef struct{ int *arr; int first; int last; } Queue; void init_queue(Queue *queue, int n){ queue->arr = (int *) calloc(n, sizeof(int)); queue->first = queue->last = 0; } void enq(Queue queue, int input){ queue->arr[queue->last++] = input; } int deq(Queue *queue){ int output = queue->arr[queue->first++]; return output; }

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

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

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

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

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

y_waiwai

2020/06/14 15:55

コンパイルエラーはどうなったんでしょうか
rft3

2020/06/14 16:00

直りませんでした。どうやらcalc_distance内にも問題があるようなのでそこをもう少し考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問