자료구조 과제 01
희소 행렬의 합
희소 행렬의 합은 두 희소 행렬 A와 B의 합을 희소 행렬 C에 저장하는 것이다. 먼저 희소 행렬의 각 항은 다음 구조체로 정의된다.
typedef struct {
int row;
int col;
int value;
} element;
그러면 희소 행렬은 다음 구조체로 정의된다.
typedef struct {
element data[100];
int rows; // 행의 개수
int cols; // 열의 개수
int terms; // 항의 개수
} SparseMatrix;
위와 같이 정의된 희소 행렬들을 가지고 두 희소 행렬의 합을 구하는 프로그램을 작성한다. (합 역시도 희소행렬로 표현한다.)
입력> 입력은 파일 입력으로 하고 입력 파일의 이름은 “input.txt”로 한다. 입력 파일의 첫 줄에 첫 번째 희소 행렬의 행과 열의 개수 N과 M이 공백을 사이에 두고 주어진다. 두 번째 줄에는 희 소 행렬의 항의 개수 S가 주어진다. 그리고 다음 S개의 줄 각각에는 각 항의 정보인 행(r), 열(c), 값(v)이 주어진다. 그 다음 줄부터 두 번째 희소 행렬의 정보가 위와 같이 주어진다. ( 2 ≤ , ≤ 100, 1 ≤ ≤ 100, 0 ≤ ≤ − 1, 0 ≤ ≤ − 1, 1 ≤ v ≤ 1,000 )
출력> 출력은 파일 출력으로 하고 출력 파일의 이름은 “output.txt”로 한다. 출력 파일에 두 희소 행렬의 합 행렬의 각 항의 정보(행, 열, 값)를 한 줄에 하나씩 출력한다.
입출력의 예>
Sample Input Sample Output
3 3 4 0 2 1 1 0 1 1 2 2 2 1 3 3 3 3 0 2 5 1 0 3 2 2 1 |
0 2 6 1 0 4 1 2 2 2 1 3 2 2 1 |
#pragma warning(disable: 4996)
#include <stdio.h>
typedef struct {
int row;
int col;
int value;
} element;
typedef struct {
element data[100];
int rows; // 행의 개수
int cols; // 열의 개수
int terms; // 항의 개수
} SparseMatrix;
int main() {
SparseMatrix a = { 0 };
SparseMatrix b = { 0 };
SparseMatrix c = { 0 };
// 일단 행열을 연산을 위한 하나의 행렬공간을 만드는데 특정값만 넣는걸 만드는게 좋치만
// 여기서는 간단히 10*10짜리를 잡겠습니다.
int add_Matrix[10][10] = { 0 }; // 선언과 동시 0으로 초기화
// 파일 하나만을 열고 닫기 때문에 하나만 사용
FILE *fp;
// fopen 함수를 통해 fp 에 input.txt 파일을 읽기 모드로 오픈해줍니다.
fp = fopen("input.txt", "r");
// fp 가 NULL 과 같다면 이건 파일이 정상적으로 오픈되지 않았다는걸 뜻합니다.
// ( 파일이 없거나 비정상적인 파일일경우 여기에 해당 )
if (!fp) { // !fp == (fp == NULL)
printf("input.txt File Open Error!!\n");
fclose(fp);
return 1;
}
// 이제 file(input.txt)을 열었으니 이제 안에 내용을 꺼내서 값을 사용합니다.
// 이때 fscanf 함수를 통해 파일에 입력된 값 을 각각 알맞게 변수에 저장.
fscanf(fp, "%d %d %d", &a.rows, &a.cols, &a.terms);
for (int i = 0; i < a.terms; i++) {
fscanf(fp, "%d %d %d", &a.data[i].row, &a.data[i].col, &a.data[i].value);
}
fscanf(fp, "%d %d %d", &b.rows, &b.cols, &b.terms);
for (int i = 0; i < b.terms; i++) {
fscanf(fp, "%d %d %d", &b.data[i].row, &b.data[i].col, &b.data[i].value);
}
// 파일을 다 사용했기때문에 이제 닫아 줍니다.
fclose(fp);
for (int i = 0; i < a.terms; i++) {
add_Matrix[a.data[i].row][a.data[i].col] = a.data[i].value;
}
for (int i = 0; i < b.terms; i++) {
add_Matrix[b.data[i].row][b.data[i].col] += b.data[i].value;
}
fp = fopen("output.txt", "w");
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (add_Matrix[i][j] != 0) {
c.data[c.terms].row = i;
c.data[c.terms].col = j;
c.data[c.terms++].value = add_Matrix[i][j];
}
}
}
// 이렇게 하면 행렬에 add_Maxtrix에 처음에 a의 희소행렬값을 넣은뒤
// 그 뒤에 희소행렬 b의 값을 더해줌으로써 10*10행렬에 값이 다 더하고 넣어 졌습니다.
// 이제 여기서 0이 아닌 데이터만 값을 뽑아서 행,열,값을 c에 희소행렬에 넣어줍니다.
for (int i = 0; i < c.terms; i++) {
fprintf(fp, "%d %d %d\n", c.data[i].row, c.data[i].col, c.data[i].value);
}
fclose(fp);
return 0;
}
나중에 다시 배열을 안쓰고 노드로 할건데여 피드백 주시면 감사하겠습니당 ㅎㅎ
Single LinkedList - 간단한 성적처리 C언어 (0) | 2018.01.26 |
---|---|
SparseMatrix(희소행렬) - 정의 (0) | 2017.09.30 |
댓글 영역