原创

矩阵的加法C语言实现(可运行)

温馨提示:
本文最后更新于 2022年04月17日,已超过 740 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

天下文章一大抄,看了好多博客,内容都是一模一样的,很少有自己写的,代码也没有注释,难受想哭!!!
这里呢,我就自己记录一下供大家参考学习

#include <stdio.h> 
#define Maxsize 10 
//三元组结构体 
typedef struct {
    int e;  //元素的值 
    int i,j;  //非零元素的行 列 坐标 
}Triple; 
//三元组矩阵 
typedef struct {
    Triple data[Maxsize+1];  //三元组数组  用来存放非零元素 
    int m,n,t;  //矩阵的 行数 列数 非零元素个数 
}TMatrix;
/**
*初始化两个三元组矩阵 
*
*/
InitTMatrix(TMatrix &A,TMatrix &B){
    /**
    *A  0 2 0   B  1 0 0   C  1 2 0
    *   3 0 1      3 0 0      6 0 1
    */
    A.m = 2;A.n = 3;A.t = 3;
    A.data[1].e = 2;
    A.data[1].i = 0;
    A.data[1].j = 1;
    A.data[2].e = 3;
    A.data[2].i = 1;
    A.data[2].j = 0;
    A.data[3].e = 1;
    A.data[3].i = 1;
    A.data[3].j = 2;

    B.m = 2;B.n = 3;B.t = 2;
    B.data[1].e = 1;
    B.data[1].i = 0;
    B.data[1].j = 0;
    B.data[2].e = 3;
    B.data[2].i = 1;
    B.data[2].j = 0;
}
PrintTMatrix(char desc[],TMatrix M){
    puts(desc);
    for(int i = 1;i<=M.t;i++){
        printf("第 %d行第%d列元素是 %d \n",M.data[i].i,M.data[i].j,M.data[i].e);
    }

}
void MatrixAdd(TMatrix A,TMatrix B,TMatrix &C){

    int p = 1,q = 1 ,k = 1;  //循环遍历 i 用于循环 控制A 矩阵 p B ;q C; 
    int an = A.t,bn = B.t;//A B 两个三元组矩阵 的元素个数 
    while(p<=an&&q<=bn){  //直到 遍历完其中一个三元组 结束循环 
        if(A.data[p].i<B.data[q].i) {  //  A矩阵中 元素的 行标 小于 B元素的行标 
            //矩阵 A 和 B没有相同行 也就没有相同列 所以直接把A的复制给C 
            C.data[k].e = A.data[p].e;
            C.data[k].i = A.data[p].i;
            C.data[k].j = A.data[p].j;
            p++;k++;  //A 矩阵完成了一个元素的加操作 C矩阵也存入了一个元素 
        }else if(A.data[p].i==B.data[q].i){  //  A矩阵中 元素的 行标 等于 B元素的行标 
            //矩阵 A 和 B有相同行 接下来判断是否有相同列 
            if(A.data[p].j<B.data[q].j){
                //矩阵 A 和 B有相同行 没有相同列 
                C.data[k].e = A.data[p].e;
                C.data[k].i = A.data[p].i;
                C.data[k].j = A.data[p].j;
                p++;k++;  //A 矩阵完成了一个元素的加操作 C矩阵也存入了一个元素 
            }else if(A.data[p].j==B.data[q].j) {
                C.data[k].e = A.data[p].e + B.data[q].e;
                C.data[k].i = A.data[p].i;
                C.data[k].j = A.data[p].j;
                p++;q++;k++;
            }else{
                //矩阵 A 和 B有相同行 但没有相同列 所以直接把B的复制给C 
                C.data[k].e = B.data[q].e;
                C.data[k].i = B.data[q].i;
                C.data[k].j = B.data[q].j;
                q++;k++;  //B 矩阵完成了一个元素的加操作 C矩阵也存入了一个元素 
            }

        }else{  //  A矩阵中 元素的 行标 大于 B元素的行标 
            //矩阵 A 和 B没有相同行 也就没有相同列 所以直接把B的复制给C 
            C.data[k].e = B.data[q].e;
            C.data[k].i = B.data[q].i;
            C.data[k].j = B.data[q].j;
            q++;k++;  //B 矩阵完成了一个元素的加操作 C矩阵也存入了一个元素 
        }
    }
    while(p<=an) {
        C.data[k] = A.data[p];
        p++;k++;
    }
    while(q<=bn){
        C.data[k] = B.data[q];
        q++;k++;  
    }
    C.t = k-1;
    C.m = A.m;
    C.n = A.n;

}
main(){

    TMatrix A,B,C;
    InitTMatrix(A,B);
    PrintTMatrix("矩阵 A",A);
    PrintTMatrix("矩阵 B",B);
    MatrixAdd(A,B,C);
    PrintTMatrix("矩阵 C",C);


}

简单的把算法实现出来了 也没有考虑健壮性等等,如发现问题,欢迎大家指正。

file

正文到此结束
本文目录