資料結構 稀疏矩陣的加減
阿新 • • 發佈:2018-11-24
#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;
}