アプリ版:「スタンプのみでお礼する」機能のリリースについて

関数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;
}

A 回答 (1件)

なんで構造体やリストを使わにゃならんのか.



しかし <malloc.h> っていつの時代だろ....
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています