상세 컨텐츠

본문 제목

희소행렬(SparseMatrix) 연산 - 덧셈

자료구조

by ChrisMare 2017. 10. 1. 00:17

본문

자료구조 과제 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

관련글 더보기

댓글 영역