C言語のNode構造体の勉強をしています。いくら考えてもこの問題が分かりません。どうかご教授お願いします。
distance.cに対して,
degV, adjM, namesの代わりに
Nodeのメンバ変数degree, adj_nodes, nameを
用いたプログラムに修正せよ.
それに伴い,calc_distance関数の引数やキューの
要素をNode構造体へのポインタとせよ.
改良箇所の詳細
[distance.c]
- includeするヘッダの変更
⁃ read_graph.h → graph_struct.h
2. calc_distance関数の引数
⁃ int → Node構造体へのポインタ
3. calc_distance関数内の変数
- disV配列の添え字 → メンバ変数id-1
- degV → メンバ変数degree
- adjM → メンバ変数adj_nodes
- node, adj_node:int型 → Node構造体へのポインタ
- print_distance関数内
⁃ fprintfのnames → メンバ変数name
[queue.h]
- 構造体定義内
⁃ 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; }
あなたの回答
tips
プレビュー