| ||||||||||||||||||||||||||||
#include <stdio.h> #include <stdlib.h> #include <assert.h> typedef struct matrix_ { int **val; int row, col; } *matrix_t; matrix_t matrix_alloc(int row, int col) { matrix_t matrix; int *p = (int *)calloc(row*col, sizeof(int)); int j; matrix = (matrix_t)malloc(sizeof(*matrix)); matrix->row = row; matrix->col = col; matrix->val = (int **)calloc(row, sizeof(int *)); for (j = 0; j != row; ++j) { matrix->val[j] = p + j*col; } return matrix; } void matrix_free(matrix_t matrix) { free(*matrix->val); free(matrix->val); free(matrix); } matrix_t matrix_read() { matrix_t matrix; int row, col; int j, k; scanf("%d%d", &row, &col); matrix = matrix_alloc(row, col); for (j = 0; j != row; ++j) { for (k = 0; k != col; ++k) { scanf("%d", &matrix->val[j][k]); } } return matrix; } void matrix_print(matrix_t matrix) { int j, k; for (j = 0; j != matrix->row; ++j) { printf("%d", matrix->val[j][0]); for (k = 1; k != matrix->col; ++k) { printf(" %d", matrix->val[j][k]); } printf("\n"); } } matrix_t matrix_multiply(matrix_t A, matrix_t B) { assert(A->col == B->row); int i, j, k; matrix_t C = matrix_alloc(A->row, B->col); for (i = 0; i != A->row; ++i) { for (k = 0; k != B->col; ++k) { C->val[i][k] = 0; } } for (i = 0; i != A->row; ++i) { for (j = 0; j != A->col; ++j) { for (k = 0; k != B->col; ++k) { C->val[i][k] += A->val[i][j] * B->val[j][k]; } } } return C; } int main() { matrix_t A = matrix_read(); matrix_t B = matrix_read(); matrix_t C = matrix_multiply(A, B); matrix_print(C); matrix_free(A); matrix_free(B); matrix_free(C); return 0; } |