前提・実現したいこと
私の質問欄の1つ前の質問の続きです。
取り除く行及び列を指定するのですが、指定する数が2つ以上になると
正しい結果が返ってきません。結果を記述します。
0と1を指定したのにもかかわらず、結果から推定するに0と2を指定したかのような結果になっています。
原因が突き止められないため質問しました。
該当のソースコード
#include <stdio.h> #include <stdlib.h> #include <string.h> #define NAME_MAX 256 /* rows行×cols列の行列をプリントする */ void print(int **mtx, int rows, int cols) { int row, col; for ( row = 0; row < rows; ++row) { for ( col = 0; col < cols; ++col ) { printf("%d ", mtx[row][col]); } printf("\n"); } printf("\n"); } /* rows行×cols列の行列から target_row行を削除する */ void erase_row(int **mtx, int rows, int cols, int target_row) { int row, col; for ( row = target_row; row < rows-1; ++row ) { for ( col = 0; col < cols; ++col ) { mtx[row][col] = mtx[row+1][col]; } } } /* rows行×cols列の行列から target_col列を削除する */ void erase_col(int **mtx, int rows, int cols, int target_col) { int row, col; for (row = 0; row < rows; ++row) { for (col = target_col; col < cols-1; ++col) { mtx[row][col] = mtx[row][col+1]; } } } int main( int argc, char *argv[] ) { int i, j; int N; int **org_adjacent; int **new_adjacent; int n1, n2; FILE *fp; char fn[NAME_MAX]; int delete[2]={0,1}; if ( argc != 2 ) { fprintf( stderr, "Usage: %s graph_file\n", argv[0] ); exit( 1 ); } strcpy( fn, argv[1] ); if (( fp = fopen( fn, "r" )) == NULL ) { fprintf( stderr, "File open error %s\n", fn ); exit( 1 ); } //ファイルの先頭を読み取り行列の大きさを取得する fscanf( fp, "%d", &N ); org_adjacent = (int **)malloc(sizeof(int *)*N); new_adjacent = (int **)malloc(sizeof(int *)*N); for(i=0;i<N;i++){ org_adjacent[i] = (int *)malloc(sizeof(int)*N); new_adjacent[i] = (int *)malloc(sizeof(int)*N); } for(i=0;i<N;i++) for(j=i;j<N;j++) org_adjacent[i][j] = org_adjacent[j][i] = 0; while( fscanf( fp, "%d %d", &n1, &n2 ) != EOF ) { org_adjacent[n1][n2]++; org_adjacent[n2][n1]++; } for(i=0;i<N;i++) for(j=0;j<N;j++) new_adjacent[i][j] = org_adjacent[i][j]; print(new_adjacent,N,N); int rows = N; int cols = N; erase_row(new_adjacent, rows, cols, delete[0]); --rows; erase_row(new_adjacent, rows, cols, delete[1]); --rows; erase_col(new_adjacent, rows, cols, delete[0]); --cols; erase_col(new_adjacent, rows, cols, delete[1]); --cols; print(new_adjacent, rows, cols); for(i=0;i<N;i++){ free(org_adjacent[i]); free(new_adjacent[i]); } free(org_adjacent); free(new_adjacent); return 0; }
結果
元の行列
0 1 1 1 0 1 1 1 1 0 1 0 1 1 0 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 0 0 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 1 1 0 0 0 0 1 0 1 1 0 0 0 0 1 1 0
0行目、1行目、0列目、1列目を取り除く
期待する結果
0 1 0 1 0 0 1 0 1 0 0 0 0 1 0 1 0 0 1 0 1 0 1 1 0 0 0 1 0 1 0 0 0 1 1 0
自分のプログラムを実行した結果
0 0 1 1 0 0 0 0 1 0 0 0 1 1 0 1 0 0 1 0 1 0 1 1 0 0 0 1 0 1 0 0 0 1 1 0
回答2件
あなたの回答
tips
プレビュー