본문 바로가기

공부/컴퓨터

희소 행렬을 입력 받아서 그 곱을 일반 행렬로 출력하기

반응형


#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

typedef struct tag_triple {
       int row;
       int col;
       int value;
} triple ;


triple * input_matrix()
{
       triple * a;
       int rowc , colc , valuec , temp ;
       int ro, co, va;
       printf("input Total row  col  value_count : ");
       
       scanf("%d%d%d",&rowc, &colc , &valuec );
       a = ( triple * ) malloc ( sizeof(triple) * valuec );
       
       printf("
");
       
       a[0].row = rowc;
       a[0].col = colc;
       a[0].value = valuec;
       
       for ( temp = 1 ;  temp  < valuec+1 ;  temp ++ )
       {
                       printf("input row col value : ");
               scanf("%d%d%d", &ro, &co, &va);
               a[temp].row = ro;
               a[temp].col = co;
               a[temp].value = va;
       }
               printf("
");

       return a;
       
}



int* mul(triple *a, triple *b) {

       int * res;
       int a_x,a_y,a_t;
       int b_x,b_y,b_t;
       int temp1=0;
       int temp2=0;

       a_x = a[0].row;
       a_y = a[0].col;
       a_t = a[0].value;

       b_x = b[0].row;
       b_y = b[0].col;
       b_t = b[0].value;


       // 결과를 저장할 일반 행렬
       res = (int*)malloc(sizeof(int)*a_x*b_y);
       memset(res,0,sizeof(int)*a_x*b_y);


       // a_m 행렬과 b_m 행렬을 곱해 봅시다.
       // 두 행렬을 곱해서 res에 저장하기만 하면 됨.
       for ( temp1 = 1 ; temp1 < a_t+1 ; temp1++ )
       {
               for ( temp2 = 1 ; temp2 < b_t+1 ; temp2++ )
               {
                       if ( a[temp1].col == b[temp2].row ) {
                               *(res + ( a[temp1].row-1) * b_y + b[temp2].col-1) += a[temp1].value * (b[temp2].value);
                       }
               }
       }



       return res;
}


void print(int* res, int row, int col)
{

       int *t = res;
       int temp1 = 0;
               int temp2 = 0;
       
       // 출력할때 row 와 col을 보고 res를 출력해 준다.

       for ( temp1 = 0 ; temp1 < row ; temp1++ )
       {
               for ( temp2 = 0 ; temp2 < col ; temp2++ )
               {
                       printf("%3d  ", *t);
                       t++;
               }
               printf("
");
       }

}

int main(void)
{

       triple *a = NULL;
       triple *b = NULL;
       int *res = NULL;
       
       a = input_matrix();
       b = input_matrix();
       
       res = mul(a,b);

       print(res, a->row, b->col);


       //free(a);
       //free(b);
       //free(res);

       return 0;

}

=======================================================================
문제는 free시키는데서 세그멘테이션 에러가 뜬다.
함수안에서 malloc시키고 밖에서 free를 해 주어서 그런건가?
정확한 이유는 아직 찾지 못했다.


반응형