1. 程式人生 > >資料結構 稀疏矩陣的加減

資料結構 稀疏矩陣的加減

#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; }