<3.1> 희소행렬의 행/열 개수를 정하고, 0이 아닌 항의 개수가 없는 상태로 초기화시키는 함수를 구현하시오

<3.2> 희소행렬에 0이 아닌 항 하나를 추가하는 함수를 구현하시오

#include <stdio.h>
#include <stdlib.h>
#define ROWS 3
#define COLS 3
#define MAX_TERMS 10
typedef struct {
int row;
int col;
int value;
} element;
typedef struct SparseMatrix {
element data[MAX_TERMS];
int rows;// 행의개수
int cols;// 열의개수
int terms; // 0이아닌항의개수
} SparseMatrix;
// 희소행렬덧셈함수
SparseMatrix sparse_matrix_add2(SparseMatrix a, SparseMatrix b) // C=A+B
{
SparseMatrix c;
int ca=0, cb=0, cc=0;
// 크기가같은지를확인
if( a.rows != b.rows || a.cols != b.cols ){
fprintf(stderr,\"희소행렬크기에러\\n\");
exit(1);
}
c.rows = a.rows;
c.cols = a.cols;
c.terms = 0;
while( ca < a.terms && cb < b.terms ){
int inda = a.data[ca].row * a.cols + a.data[ca].col;
int indb = b.data[cb].row * b.cols + b.data[cb].col;
if( inda < indb) {
// b 항목이더나중에와야함
c.data[cc++] = a.data[ca++];
}
else if( inda == indb ){
// a와b가같은위치
c.data[cc].row = a.data[ca].row;
c.data[cc].col = a.data[ca].col;
c.data[cc++].value = a.data[ca++].value +
b.data[cb++].value;
}
else
c.data[cc++] = b.data[cb++];
}
// 나머지항들을옮긴다.
for(; ca < a.terms; ca++)
c.data[cc++] = a.data[ca++];
for(; cb < b.terms; cb++)
c.data[cc++] = b.data[cb++];
c.terms = cc;
return c;
}
void printMatrix( SparseMatrix receivedMatrix)
{
int flag = 1;
int n;
int i = 0;
int m = 0;
for(i = 0; i < receivedMatrix.rows; i++){
for(m = 0; m < receivedMatrix.cols; m++){
for(n = 0; n < receivedMatrix.terms; n++){
if(i == receivedMatrix.data[n].row && m == receivedMatrix.data[n].col){
printf(\" %2d \",receivedMatrix.data[n].value);
flag = 1;
break
}else
flag = 0;
}//for_3
if(flag == 0) printf(\" %2d \",0);
flag = 0;
}//for_2
printf(\"\\n\");
}//for_1
printf(\"\\n\");
}
「--------------------------------------------
void sparse_matrix_init (SparseMatrix *receivedMatrix, int row, int col){
// 1. 희소행렬의 행(row)과 열(col)의 개수를 정하고,
// 0이 아닌 항의 개수가 없는 상태로 receivedMatrix를 초기화시키는 함수를 구현하시오

}
--------------------------------------1번」

「------------------------------------
void sparse_matrix_addElement (SparseMatrix *receivedMatrix, int rowE, int colE, int valueE){
element tempElement;
tempElement.row = rowE;
tempElement.col = colE;
tempElement.value = valueE;
// 2. 이 함수의 뒷부분을 작성하여,
// receivedMatrix에0이 아닌항 tempElement를 추가하는 함수를 구현하시오


}
-------------------------------------------2번」
void main(void)
{
//SparseMatrix m1~m3를동적할당
SparseMatrix* m1=(SparseMatrix*)malloc(sizeof(SparseMatrix));
SparseMatrix* m2=(SparseMatrix*)malloc(sizeof(SparseMatrix));
SparseMatrix* m3=(SparseMatrix*)malloc(sizeof(SparseMatrix));
// m1~m3를3x3 크기로초기화
sparse_matrix_init(m1, 3, 3);
sparse_matrix_init(m2, 3, 3);
sparse_matrix_init(m3, 3, 3);
// m1,m2에element 추가
// SparseMatrix m1 = {{{ 1,1,5 },{ 1,2,3 }, { 2,2,9 }}, 3,3,3 };
sparse_matrix_addElement(m1, 1,1,5);
sparse_matrix_addElement(m1, 1,2,3);
sparse_matrix_addElement(m1, 2,2,9);
// SparseMatrix m2 = {{{ 0,0,5 },{ 1,1,2 }, { 2,2,9 }}, 3,3,3 };
sparse_matrix_addElement(m2, 0,0,5);
sparse_matrix_addElement(m2, 1,1,2);
sparse_matrix_addElement(m2, 2,2,9);
*m3 = sparse_matrix_add2(*m1, *m2);
printf(\"\\n\\n\");
printMatrix(*m1);
printMatrix(*m2);
printMatrix(*m3);
// 동적할당해제
free(m1); free(m2); free(m3);
}