数据结构 稀疏矩阵的加减

#include <cstdio>
#include <iostream>
#define MAX 50
#define m 6
#define n 8
using namespace std;
typedef struct TripleNode
{
    int i,j,v;
}Triple[MAX];
void InitMatrix(int A[m][n],int B[m][n])
{
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
        {
            A[i][j]=0;
            B[i][j]=0;
        }
    A[0][2]=3;
    A[1][6]=5;
    A[3][4]=7;
    A[5][1]=9;
    B[0][1]=2;
    B[1][3]=4;
    B[2][5]=6;
    B[3][4]=8;
    B[4][2]=1;
}
void CreateMatrix(int S[m][n],Triple A)
{
    int k=0;
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
            if(S[i][j]!=0)
            {
                 A[k].i=i;
                 A[k].j=j;
                 A[k].v=S[i][j];
                 k++;
            }
    A[k].i=-1;
}

void MatrixAdd(Triple A,Triple B,Triple C)
{
    int i=0,j=0,s=0;
    while(1)
    {
        if(A[i].i==-1&&B[j].i==-1 ) break;
        else if(A[i].i==-1&&B[j].i!=-1)
        {
            C[s].i=B[j].i;
            C[s].j=B[j].j;
            C[s].v=B[j].v;
            s++;j++;
        }
        else if(A[i].i!=-1&&B[j].i==-1)
        {
            C[s].i=A[i].i;
            C[s].j=A[i].j;
            C[s].v=A[i].v;
            i++;s++;
        }
        else if(A[i].i==B[j].i&&A[i].j==B[j].j)
        {
            C[s].i=A[i].i;
            C[s].j=A[i].j;
            C[s].v=A[i].v+B[j].v;
            i++;s++;j++;
        }
        else if(A[i].i<B[j].i||(A[i].i==B[j].i&&A[j].j<B[j].j))
        {
            C[s].i=A[i].i;
            C[s].j=A[i].j;
            C[s].v=A[i].v;
            i++;s++;
        }
        else
        {
            C[s].i=B[j].i;
            C[s].j=B[j].j;
            C[s].v=B[j].v;
            s++;j++;
        }
    }
    C[s].i=-1;
}

void MatrixSub(Triple A,Triple B,Triple C)
{
    int i=0,j=0,s=0;
    while(1)
    {
        if(A[i].i==-1&&B[j].i==-1 ) break;
        else if(A[i].i==-1&&B[j].i!=-1)
        {
            C[s].i=B[j].i;
            C[s].j=B[j].j;
            C[s].v=B[j].v;
            s++;j++;
        }
        else if(A[i].i!=-1&&B[j].i==-1)
        {
            C[s].i=A[i].i;
            C[s].j=A[i].j;
            C[s].v=A[i].v;
            i++;s++;
        }
        else if(A[i].i==B[j].i&&A[i].j==B[j].j)
        {
            C[s].i=A[i].i;
            C[s].j=A[i].j;
            C[s].v=A[i].v-B[j].v;
            i++;s++;j++;
        }
        else if(A[i].i<B[j].i||(A[i].i==B[j].i&&A[j].j<B[j].j))
        {
            C[s].i=A[i].i;
            C[s].j=A[i].j;
            C[s].v=A[i].v;
            i++;s++;
        }
        else
        {
            C[s].i=B[j].i;
            C[s].j=B[j].j;
            C[s].v=0-B[j].v;
            s++;j++;
        }
    }
    C[s].i=-1;
}

int main ()
{
    int E[m][n],F[m][n];
    Triple A,B,C,D,H,K;
    int i,j,k,l;
    InitMatrix(E,F);
    CreateMatrix(E,A);
    CreateMatrix(F,B);
    MatrixAdd(A,B,C);
    MatrixSub(A,B,D);
    i=0;j=0;k=0;l=0;
    printf("A\n");
    while(A[i].i!=-1)
    {
        cout<<A[i].i<<" "<<A[i].j<<" "<<A[i].v<<endl;
        i++;
    }
    cout<<"B:"<<endl;
    while(B[j].i!=-1)
    {
        cout<<B[j].i<<" "<<B[j].j<<" "<<B[j].v<<endl;
        j++;
    }
    cout<<"C:"<<endl;
    while(C[k].i!=-1)
    {
        cout<<C[k].i<<" "<<C[k].j<<" "<<C[k].v<<endl;
        k++;
    }
    cout<<"D:"<<endl;
    while(D[l].i!=-1)
    {
        cout<<D[l].i<<" "<<D[l].j<<" "<<D[l].v<<endl;
        l++;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/curiosity9/article/details/84070022
今日推荐