質問編集履歴

1

皆様からご指摘いただいた様に、テンプレートに沿い書き直しました。

2020/07/01 06:23

投稿

Jhon_McClane
Jhon_McClane

スコア48

test CHANGED
@@ -1 +1 @@
1
- N×Nの行列において指定した数値の行と列を消したい
1
+ N×Nの行列において指定した数値の行と列を取り除く
test CHANGED
@@ -2,8 +2,284 @@
2
2
 
3
3
 
4
4
 
5
- 現在隣接行列において、特定の行と列を消すプログラミングを作りたいと考えています。
5
+ 既にある隣接行列において、特定の行と列を除い後に、残った行列で省た箇所を詰め直し、新しく隣接行列を作ろうと考えています。尚、既にある隣接行列はその後に使うためデータとして残し、新しく隣接行列を作ります。
6
-
6
+
7
- 例:8*8の隣接行列において、2、5のそれぞれの行と列を消す。2行目全体、2列目全体といった感じです。消されなかった部分で新しく隣接行列を作り直したいです。
7
+ 例:8*8の隣接行列において、2、5のそれぞれの行と列を取り除く。2行目全体、2列目全体といった感じです。取り除かれなかった部分で詰め直して新しく隣接行列を作り直したいです。
8
+
9
+
10
+
8
-
11
+ ### 発生している問題・エラーメッセージ
12
+
9
- このアルゴリズムがかなか思つきません。for文やループ変数たくさん使用してしまし、上手くけません。c言語を使用して書きです。詰まってしまい方法思いつないたお力添えいただければ幸い
13
+ セグメントエラーと思われる箇所にて参照できないメモリを使てしまっているのと考えですどこ直接の原因なの突き止るこトがきません。
14
+
15
+ ```
16
+
17
+ セグメントエラーが発生しています
18
+
19
+ ```
20
+
21
+
22
+
23
+ ### 該当のソースコード
24
+
25
+
26
+
27
+ ```ここに言語名を入力
28
+
29
+ #include <stdio.h>
30
+
31
+ #include <stdlib.h>
32
+
33
+ #include <string.h>
34
+
35
+
36
+
37
+
38
+
39
+ #define NAME_MAX 256
40
+
41
+
42
+
43
+ int main( int argc, char *argv[] )
44
+
45
+ {
46
+
47
+ int i, j;
48
+
49
+ int N = 0;
50
+
51
+ int **adjacent;
52
+
53
+ int **new_adjacent;
54
+
55
+ int n1, n2;
56
+
57
+ FILE *fp;
58
+
59
+ char fn[NAME_MAX];
60
+
61
+ int delete1 = 2;//例:取り除く行と列
62
+
63
+ int delete2 = 5;//例:取り除く行と列
64
+
65
+ int a=0;
66
+
67
+ int b=0;
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+ if ( argc != 2 ) {
76
+
77
+ fprintf( stderr, "Usage: %s graph_file\n", argv[0] );
78
+
79
+ exit( 1 );
80
+
81
+ }
82
+
83
+
84
+
85
+ strcpy( fn, argv[1] );
86
+
87
+
88
+
89
+ if (( fp = fopen( fn, "r" )) == NULL ) {
90
+
91
+ fprintf( stderr, "File open error %s\n", fn );
92
+
93
+ exit( 1 );
94
+
95
+ }
96
+
97
+
98
+
99
+ //ファイルの先頭を読み取り行列の大きさを取得する
100
+
101
+ fscanf( fp, "%d", &N );
102
+
103
+
104
+
105
+ adjacent = (int **)malloc(sizeof(int *)*N);
106
+
107
+ for(i=0;i<N;i++){
108
+
109
+ adjacent[i] = (int *)malloc(sizeof(int)*N);
110
+
111
+ }
112
+
113
+
114
+
115
+ for(i=0;i<N;i++)
116
+
117
+ for(j=i;j<N;j++)
118
+
119
+ adjacent[i][j] = adjacent[j][i] = 0;
120
+
121
+
122
+
123
+ while( fscanf( fp, "%d %d", &n1, &n2 ) != EOF ) {
124
+
125
+ adjacent[n1][n2]++;
126
+
127
+ adjacent[n2][n1]++;
128
+
129
+ }
130
+
131
+
132
+
133
+ //display
134
+
135
+ for ( i=0; i<N; i++ ) {
136
+
137
+ for ( j=0; j<N; j++ )
138
+
139
+ printf( "%d ", adjacent[i][j] );
140
+
141
+ printf( "\n" );
142
+
143
+ }
144
+
145
+
146
+
147
+ //ここでは予め省く要素数が既知であるため、N-2とする
148
+
149
+ //6*6の新しい隣接行列を作り、該当するadjacentの値を入れていく
150
+
151
+ new_adjacent = (int **)malloc(sizeof(int *)*(N-2));
152
+
153
+ for(i=0;i<N-2;i++){
154
+
155
+ new_adjacent[i] = (int *)malloc(sizeof(int)*(N-2));
156
+
157
+ }
158
+
159
+ //該当する行またはラインを読まないようにする
160
+
161
+  //セグメントエラーが発生している箇所
162
+
163
+ for ( i=0; i<N; i++ ) {
164
+
165
+ for ( j=0; j<N; j++ ){
166
+
167
+ if(!(i==delete1 || i==delete2 || j==delete1 || j==delete2)){
168
+
169
+ new_adjacent[a][b] = adjacent[i][j];
170
+
171
+ b++;
172
+
173
+ }
174
+
175
+ }
176
+
177
+ b=0;
178
+
179
+ a++;
180
+
181
+ }
182
+
183
+
184
+
185
+ printf("\n");
186
+
187
+
188
+
189
+ //display
190
+
191
+ for ( i=0; i<N-2; i++ ) {
192
+
193
+ for ( j=0; j<N-2; j++ )
194
+
195
+ printf( "%d ", new_adjacent[i][j] );
196
+
197
+ printf( "\n" );
198
+
199
+ }
200
+
201
+
202
+
203
+ for(i=0;i<N-2;i++)
204
+
205
+ free(new_adjacent[i]);
206
+
207
+ free(new_adjacent);
208
+
209
+
210
+
211
+ for(i=0;i<N;i++)
212
+
213
+ free(adjacent[i]);
214
+
215
+ free(adjacent);
216
+
217
+
218
+
219
+ return 0;
220
+
221
+ }
222
+
223
+
224
+
225
+
226
+
227
+ ```
228
+
229
+ 読み取るファイル
230
+
231
+ ```ここに言語を入力
232
+
233
+ 8
234
+
235
+ 4 3
236
+
237
+ 4 1
238
+
239
+ 3 2
240
+
241
+ 1 0
242
+
243
+ 1 2
244
+
245
+ 2 5
246
+
247
+ 0 5
248
+
249
+ 0 6
250
+
251
+ 6 7
252
+
253
+ 7 5
254
+
255
+ 0 7
256
+
257
+ 6 5
258
+
259
+ 5 1
260
+
261
+ 2 0
262
+
263
+ 3 0
264
+
265
+ 4 5
266
+
267
+
268
+
269
+ ```
270
+
271
+
272
+
273
+ ### 試したこと
274
+
275
+ 省きたいラインをforループで回したときに読み込まないようにすることでnew_adjacentへ格納できると思いプログラムを書きました。しかし、要素数が順番にならないため別の変数(a,b)を用いて試したのですが、セグメントエラーが発生しました。このエラーが発生している箇所はプログラムに書きました。
276
+
277
+ この箇所の記述が上手くイメージできません。
278
+
279
+
280
+
281
+ ### 補足情報(FW/ツールのバージョンなど)
282
+
283
+
284
+
285
+ Oracle VM VirtualBox