![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
関数translate_into_graph()を完成させて、隣接行列のファイルを読み込んで、有向きグラフの情報をdot形式にて表示するプログラム(C言語で)をつくりたいです。構造体や、リストを最近習ったばかりで、このプログラムを理解して完成させるのが難しかったので、是非教えて頂けないでしょうか。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define N 5
#define boolean int
#define true 1
#define false 0
typedef boolean adjmatrix[N][N];
typedef int vindex;
typedef struct edgecell { // 有向辺のデータ構造
vindex destination; // 有向辺の終点destination
struct edgecell ∗next; // 始点を同じくする,他の有向辺へのポインタ
} edgecell;
typedef edgecell ∗ vertices[N];
typedef struct { // グラフのデータ構造
int vertex num; // 頂点数
int edge num; // 辺の数
vertices vtop; // 頂点のデータ構造
} graph;
// 隣接行列をファイル datafile から読み込む
int read adjacency matrix( char ∗datafile, adjmatrix mat ) {
FILE ∗fp; // 入力データのファイルポインタ
int vertex num; 36 vindex src, dest;
fp = fopen( datafile, "r" ); // ファイルを開く
fscanf( fp, "%d\n", &vertexnum ); // 頂点数 の読み込み
if ( vertexnum >=N){
fprintf( stderr, "#####このプログラムが扱えるのは頂点数が%d までのグラフです\n", N );
exit(1); }
for (src = 0; src < vertex num; src++) {
for (dest = 0; dest < vertex num; dest++) {
fscanf( fp, "%d\n", &mat[src][dest] ); // 隣接行列の要素を1つずつ読み込む
}
} fclose( fp ); //
return vertex num;
}
// 辺の追加 辺は頂点番号 src から dest へ向う
void add edge( graph ∗g, vindex src, vindex dest ) {
edgecell ∗edge = (edgecell ∗)malloc( sizeof( edgecell ));
edge−>destination = dest;
edge−>next = g−>vtop[src];
g−>vtop[src] = edge;
}
// 隣接行列からグラフを作成
void translate into graph( adjmatrix mat, graph ∗g){
// この関数を完成させたい
// 隣接行列の要素が 1 なら有向辺があるということ → 有向辺を追加 (関数 add_edge を使う)
}
void print graph( graph ∗g){
vindex v;
printf( "digraphG{\n" );
printf( "size=\"14,10\";node[fontsize=10,height=0.01,width=0.01];edge[len=3.0];\n");
for (v = 0; v < g−>vertex num; v++) {
edgecell ∗edge;
for (edge = g−>vtop[v]; edge != NULL; edge = edge−>next) {
printf( "%d->%d;\n", v+1, edge−>destination+1 );
}
}
printf( "}\n" );
}
void free graph( graph ∗g){
vindex v;
for (v = 0; v < g−>vertex num; v++) {
edgecell ∗edge, ∗next edge;
for (edge = g−>vtop[v]; edge != NULL; edge = next edge) {
next edge = edge−>next;
free( edge );
}
}
}
int main( int argc, char ∗argv[] ) {
char ∗datafile; // 入力データのファイル名
adjmatrix a; // テキストでは大文字 A で定義
graph g;
if ( argc<=1){
fprintf( stderr, "#####ファイルを指定してください\n" );
return 1;
}
datafile = argv[1]; // ファイル名の取得
g.vertex num = read adjacency matrix( datafile, a );
translate into graph( a, &g );
print graph( &g );
free graph( &g );
return 0;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
クリップボードから画像取得
-
隣接行列を読み込んで有向グラ...
-
C言語 ファイル入出力について
-
テキストファイル内に対して, ...
-
Cで文字列の分割
-
test.csvの内容
-
fscanfでループしてしまう。
-
VisualStudioでのファイルの入...
-
フーリエ変換のC言語プログラム...
-
#define _CRT_SECURE_NO_WARNIN...
-
ファイルが読み込めない・・・
-
日本語ファイル名のFTPについて
-
C言語について
-
急!【数列を正規化して縦横入...
-
c言語 ファイルから数字を読み...
-
なぜCSQとCIP形式ではコ...
-
c言語 DFAのプログラム
-
テキストファイルをバイナリフ...
-
fscanfで格納された変数がおか...
-
プログラミング(構造体、ファイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ガンマ変換 C言語でプログラ...
-
c言語でのfscanfについて
-
なぜCSQとCIP形式ではコ...
-
複数ファイルの同時読み込みの...
-
fopenでファイル名に、変数を使...
-
ファイル出力で改行を入れたい!
-
ファイルへの書込み処理が異常...
-
【C言語】ファイルを読み込んで...
-
エラーがわかりません、、
-
C言語でセグメンテーションエ...
-
C言語でファイル読み書きを早く...
-
テキストファイル内に対して, ...
-
fgets( ) の返り値は何?
-
ファイルに行番号を追加
-
OpenGLによる描画内容をBMP出力
-
fscanfでループしてしまう。
-
c言語 ファイルから数字を読み...
-
ファイルが読み込めない・・・
-
CRC32の計算方法
-
CSVファイルの内容を構造体に格...
おすすめ情報