三元组表实现矩阵相加(数据结构)

代码:

含注释,供参考

#include 
#include 

typedef struct
{
    int row,col,value;//分别为行数,列数,数值
} Triple;
typedef struct
{
    int len;//非零数值的个数
    Triple data[200];
} TSMatrix;

void Assigndata(TSMatrix*A,TSMatrix*B,int m,int n);//给稀疏矩阵A,B的三元表赋值
void Compare(TSMatrix*A,TSMatrix*B,TSMatrix*C,int t1,int t2);//比较A,B三元表中数据的行列,并计算
int check(Triple a,Triple b);//对a,b中的行列进行比较,返回特定数字
void Printf(TSMatrix C);//打印出C中存储的数据

int main()
{
    int t1,t2;
    TSMatrix A,B,C;
    scanf("%d %d",&t1,&t2);//t1是矩阵A的非零项个数,t2是矩阵B的非零项个数
    A.len=t1;
    B.len=t2;
    Assigndata(&A,&B,t1,t2);//给稀疏矩阵A,B的三元表赋值
    Compare(&A,&B,&C,t1,t2);//比较A,B三元表中数据的行列,并计算
    Printf(C);//打印出C中存储的数据
    return 0;
}

/*给稀疏矩阵A,B的三元表赋值
 *A,B:目标三元表
 *m,n:分别是矩阵A,B的非零项个数
 */
void Assigndata(TSMatrix*A,TSMatrix*B,int m,int n)
{
    for(int i=0; idata[i].row),&(A->data[i].col),&(A->data[i].value));
    for(int i=0; idata[i].row),&(B->data[i].col),&(B->data[i].value));
}

/*比较A,B三元表中数据的行列,并计算
 *A,B:目标三元表
 *C: 存放整合后的稀疏矩阵
 *t1;A三元表的数据长度
 *t2:B三元表的数据长度
 */
void Compare(TSMatrix*A,TSMatrix*B,TSMatrix*C,int t1,int t2)
{
    int ind=0,temp=0,i,p;//ind 是B的下标,i 是A的下标,temp 是C的下标,p 用于代表value相加的值
    for(i=0; idata[i],B->data[ind]))
        {
        case 1:
        case 4:
            C->data[temp++]=A->data[i];//A的行小于B的行 或 A的行等于B的行,A的列小于B的列
            break;
        case 2:
        case 3:
            C->data[temp++]=B->data[ind++];//A的行大于B的行 或 A的行等于B的行,A的列大于B的列
            i--;
            break;
        case 5:
            p=A->data[i].value+B->data[ind++].value;
            if(p!=0)//若A,B矩阵中元素相加为0,删除该数据
            {
                C->data[temp++]=A->data[i];
                C->data[temp].value=p;//A的行等于B的行,A的列等于B的列,C->data[].value等于A,B中的数据相加
            }
            break;
        }
    }
    if(i==t1)//A表先遍历完
    {
        for(int i=ind; idata[temp++]=B->data[i];
        }
    }
    else if(ind==t2)//B表先遍历完
    {
        for(int j=i; jdata[temp++]=A->data[j];
        }
    }
    C->data[temp].row=0;//便于确定输出时结束的位置
}

/*对a,b中的行列进行比较
 *a,b:分别代表A,B中的data[]
 *返回特定数据
 1:a的行小于b的行
 2:a的行大于b的行
 3:a的行等于b的行,a的列大于b的列
 4:a的行等于b的行,a的列小于b的列
 5:a的行等于b的行,a的列等于b的列
 */
int check(Triple a,Triple b)
{
    if(a.rowb.row)
        return 2;
    else if(a.col>b.col)
        return 3;
    else if(a.col

你可能感兴趣的:(矩阵,数据结构,算法)