archive
[과제] sparse matrix transpose 개작 본문
<구현 소스코드>
#define _CRT_SECURE_NO_WARNINGS
#define MAX_COL 100
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int col;
int row;
int value;
}term;
void fastTranspose(term a[], term b[])
{
int rowTerms[MAX_COL], startingPos[MAX_COL];
int i, j, numCols = a[0].col, numTerms = a[0].value; //numTerm 0이 아닌 행렬의 원소 개수
b[0].row = numCols;
b[0].col = a[0].row;
b[0].value = numTerms;
if (numTerms > 0) { //그니까 일단 0이 아닌 행렬이 존재하긴 하는 한
for (i = 0; i < numCols; i++)
rowTerms[i] = 0; // 초기화
for (i = 1; i <= numTerms; i++)
rowTerms[a[i].col]++;
startingPos[0] = 1;
for (i = 1; i <= numCols; i++)
startingPos[i] = startingPos[i - 1] + rowTerms[i - 1];
int num=0;
for (int i = 1; i <= numTerms; i++) {
if (a[i].value >= 0) {
j = startingPos[a[i].col]++;
b[j].row = a[i].col;
b[j].col = a[i].row;
b[j].value = a[i].value;
num++;
}
else {
rowTerms[a[i].col]--;
for (int k = a[i].col; k <= numTerms; k++) {
startingPos[k]--;
}
}
}
b[0].value = num;
}
}
int main(void) {
int i, j;
term A[9] = { {6,6,8}, {0,0,15}, {0,3,22}, {0,5,-15}, {1,1,11}, {1,2,3}, {2,3,-6}, {4,0,91}, {5,2,28} };
term B[9];
printf("행의 수: %d, 열의 수: %d, 0이 아닌 항의 수: %d\n", A[0].row, A[0].col, A[0].value);
for (i = 1; i < 9; i++)
printf("행: %d, 열: %d, 값: %d\n", A[i].row, A[i].col, A[i].value);
printf("\n\n");
fastTranspose(A, B);
printf("Transpose processing has been finished.\n");
printf("\n\n");
printf("행의 수: %d, 열의 수: %d, 0이 아닌 항의 수: %d\n", B[0].row, B[0].col, B[0].value);
for (i = 1; i <= B[0].value; i++)
printf("행: %d, 열: %d, 값: %d\n", B[i].row, B[i].col, B[i].value);
printf("\n\n");
return 0;
}
<실행결과>
'C \ C++ > C 스터디 예제 풀이' 카테고리의 다른 글
[세연교재] 2과 풀이 (0) | 2023.03.18 |
---|---|
[누렁이] 1과 예제 풀이 (0) | 2023.03.18 |
(자료구조론 필사) 2장 배열과 구조 (0) | 2023.02.24 |
(자료구조론 필사) 1장 기본개념 (0) | 2023.02.13 |
11-22 C 스터디 예제 풀이) 구조체와 공용체 (0) | 2022.11.27 |