
関数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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
01番の二次元配列でこの実行結...
-
最早開始時間と最遅完了時刻を...
-
C言語 エラーの原因がわからな...
-
信頼区間の1.96や1.65ってどこ...
-
「Aに対するBの割合」と「Aに対...
-
For文の終了値を関数にしても問...
-
配列をnビットシフトする
-
数学 一次関数 関数 y=-3/4x+k(...
-
std::set<int> で、ある値が何...
-
Enterキーを押されたら次の処理...
-
sscanfとscanfの違いがよくわか...
-
main.c:7:43: warning: implici...
-
#define _CRT_SECURE_NO_WARNIN...
-
InvokeMemberメソッドとは何を...
-
【#define】 defineで定義した...
-
2の補数を計算するプログラム
-
a^2の√=a が成り立たない場合
-
2÷3などの余りについて
-
PICで小数点の演算
-
iTRONプログラミング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数ファイルの同時読み込みの...
-
C言語の課題です
-
ファイル出力で改行を入れたい!
-
fgets( ) の返り値は何?
-
C言語でファイル読み書きを早く...
-
fopenでファイル名に、変数を使...
-
ファイルに行番号を追加
-
テキストファイル内に対して, ...
-
ファイルへの書込み処理が異常...
-
C言語についてアドバイスをくだ...
-
同時にファイル読み込み 書き込み
-
初心者のc言語
-
大量の入力ファイルを扱うとき...
-
【C言語について】ファイル名の...
-
C言語 共用体の構造体の引数設定
-
C言語でのCSVソートとデータ抽...
-
エラーがわかりません、、
-
プログラムの内で、何か画面表...
-
「コマンドライン引数チェック...
-
プログラミングのデータの読み込み
おすすめ情報