矩阵利用二级指针完成乘法:

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

#define TRUE 1
#define FLASE 0

typedef struct MATRIX
{
    int ** matrix;
    int x;
    int y;
}MATRIX;

int initMatrix(MATRIX *p,int x, int y); /*对初始化后的矩阵进行赋值操作。*/
int mulMatrix(MATRIX *result,MATRIX p1,MATRIX p2); /*进行矩阵乘法。*/
int newMatrix(MATRIX *p,int x,int y); /*初始化确定阶数的矩阵。*/
int freeMatrix(MATRIX *p);
int freeMatrix(MATRIX *p)
{
    int **temp = NULL;
    int i;
    temp = p->matrix;
    if(NULL == temp)
    {
        printf("释放空间失败.");
        return FLASE;
    }

    for(i=0;i<(p->x);i++)
        free(temp[i]);

    free(temp);

    p->matrix = NULL;

    return TRUE;
}
int newMatrix(MATRIX *p,int x,int y)
{
    int **temp = NULL; 


    int tmp = 0;

    temp = (int **)calloc(sizeof(int *) , x);

    if(temp != NULL)
    {
        for(tmp = 0; tmp < x; tmp++)
        {
            temp[tmp] = (int *)calloc(sizeof(int) , y);



            if(temp[tmp] == NULL)
            {
                for(tmp-- ;tmp >= 0;tmp--)
                    free(temp[tmp]);
                free(temp);
                printf("初始化失败。");
                return FLASE;
            }
        }
    }
    else
    {
        printf("初始化失败。");
        return FLASE;
    }
    p->matrix = temp;
    p->x = x;
    p->y = y;

    return TRUE;
}
int mulMatrix(MATRIX *result,MATRIX p1,MATRIX p2)
{
    int i = 0,j = 0;
    int k = 0;
    int tmp = 0;
    if(p1.y != p2.x)
    {
        printf("%dx%d与%dx%d矩阵不能相乘。\n", p1.x, p1.y, p2.x, p2.y);
        return FLASE;
    }

    newMatrix(result,p1.x,p2.y);  /* n*m 与 m*n  矩阵相乘结果是 n*n。*/

    result->x = p1.x;
    result->y = p2.y;

    for(i=0;i<p1.x;i++)
    {
        for(j=0;j<p2.y;j++)
        {
            for(k=0;k<p1.y;k++)
            {
                (result->matrix)[i][j] += p1.matrix[i][k] * p2.matrix[k][j];
            }
        }
    }

    for(i=0;i<(result->x);i++)
    {
        for(j=0;j<result->y;j++)
            printf("%-6d ",(result->matrix)[i][j]);
        printf("\n");
    }


    return TRUE;
}
int initMatrix(MATRIX *p,int x,int y)
{
    int **temp = NULL; 
    int i,j;

    newMatrix(p,x,y);
    temp = p->matrix;
    for(i=0;i<x;i++)
    {
        for(j=0;j<y;j++)
        {
            printf("请输入下标为(%d %d)的数:",i+1,j+1);
            scanf("%d",&temp[i][j]);
        }
    }

    return TRUE;
}

void main()
{
    MATRIX matrix1;
    MATRIX matrix2;
    MATRIX matrix3;
    int x,y;
    int OK = TRUE;
    printf("请输入第一个矩阵的阶数中间用空格隔开如(3 4):");
    scanf("%d%d",&x,&y);
    initMatrix(&matrix1,x,y);
    printf("请输入第二个矩阵的阶数中间用空格隔开:");
    scanf("%d%d",&x,&y);
    initMatrix(&matrix2,x,y);
    printf("计算的结果如下:\n");
    OK = mulMatrix(&matrix3,matrix1,matrix2);

    freeMatrix(&matrix1);
    freeMatrix(&matrix2);
    if(TRUE == OK)  /*如果matrix3申请了空间就需要释放,如果没有则不需要*/
        freeMatrix(&matrix3);
}

在VC运行下可通过。

猜你喜欢

转载自blog.csdn.net/yirol_/article/details/50177125