稀疏矩阵运算器-数据结构课程设计

稀疏矩阵运算器-数据结构课程设计|数据结构课程设计
/*******************************稀疏矩阵运算器*************************************/
#include "stdio.h"
#include "stdlib.h"
#define   MAXSIZE   20    /*非零元个数*/
#define   MAXRC     20
#define   MAXR      20
#define   MAXC      20
typedef   struct{
    int i,j;              /*非零元行下标和列下标*/
    int e;
} Triple ;
typedef   struct{
    Triple   data[MAXSIZE+1];  /*非零元三元组,data[0]未用*/
    int      rpos[MAXRC+1];    /*各行第一非零元的位置表*/
    int      mu,nu,tu;          /*矩阵的行数,列数,非零元数*/
} RLSMatrix  ;
void Print(RLSMatrix  *A,RLSMatrix  *B,RLSMatrix *T);
void ADD(RLSMatrix  *A,RLSMatrix  *B,RLSMatrix *T)      /*加法*/
{
       int x=1;
       int y=1;
       int z=1;
      
       T->tu=0;
       T->mu=A->mu;
       T->nu=A->nu;
      
       while(x<=A->tu)
       {
            
           if(A->data[x].i<B->data[y].i)
           {
                T->data[z].i=A->data[x].i;
                T->data[z].j=A->data[x].j;
                T->data[z].e=A->data[x].e;
                x++;z++;
           }
      
          else if(A->data[x].i==B->data[y].i)
          {
             if(A->data[x].j>B->data[y].j)
             {
                T->data[z].i=B->data[y].i;
                T->data[z].j=B->data[y].j;
                T->data[z].e=B->data[y].e;
                y++;z++;
             }
             else if(A->data[x].j==B->data[y].j){
              if((T->data[z].e=A->data[x].e+B->data[y].e)!=0)
    {
     T->data[z].i=A->data[x].i;
           T->data[z].j=A->data[x].j;
     x++;
     y++;
     z++;
    }
    else
    {
        x++;
     y++;
    }
    }
             else if(A->data[x].j<B->data[y].j)
             {
                T->data[z].i=A->data[x].i;
                T->data[z].j=A->data[x].j;
                T->data[z].e=A->data[x].e;
                x++;z++;
             }
         }
          else if(A->data[x].i>B->data[y].i)
          {
                T->data[z].i=B->data[y].i;
                T->data[z].j=B->data[y].j;
                T->data[z].e=B->data[y].e;
                y++;z++;
           }
       if(y>=B->tu)
           break;
       }
       if(x<=A->tu){
            while(x<=A->tu){
                T->data[z].i=A->data[x].i;
                T->data[z].j=A->data[x].j;
                T->data[z].e=A->data[x].e;
                x++;z++; 
            }
       }
       if(y<=B->tu){
            while(y<=B->tu){ 
                T->data[z].i=B->data[y].i;
                T->data[z].j=B->data[y].j;
                T->data[z].e=B->data[y].e;
                y++;z++; 
            }
       }
  
   T->tu=z;
   Print(A,B,T);
}
void SUB(RLSMatrix  *A,RLSMatrix  *B,RLSMatrix *T)     /*减法*/
{
       int x=1;
       int y=1;
       int z=1;
       T->tu=0;
       T->mu=A->mu;
       T->nu=A->nu;
       while(x<=A->tu)
       {
           if(A->data[x].i<B->data[y].i)
           {
                T->data[z].i=A->data[x].i;
                T->data[z].j=A->data[x].j;
                T->data[z].e=A->data[x].e;
                x++;z++;
           }
      
          else if(A->data[x].i==B->data[y].i)
          {
             if(A->data[x].j>B->data[y].j)
             {
                T->data[z].i=B->data[y].i;
                T->data[z].j=B->data[y].j;
                T->data[z].e=0-B->data[y].e;
                y++;z++;
             }
             else if(A->data[x].j==B->data[y].j){
                 if((T->data[z].e=A->data[x].e-B->data[y].e)!=0)
    {
     T->data[z].i=A->data[x].i;
           T->data[z].j=A->data[x].j;
     x++;
     y++;
     z++;
    }
    else
    {
        x++;
     y++;
    }
    }
             else if(A->data[x].j<B->data[y].j)
             {
                T->data[z].i=A->data[x].i;
                T->data[z].j=A->data[x].j;
                T->data[z].e=A->data[x].e;
                x++;z++;
            }
         }
         else if(A->data[x].i>B->data[y].i)
         {
                T->data[z].i=B->data[y].i;
                T->data[z].j=B->data[y].j;
                T->data[z].e=0-B->data[y].e;
                y++;z++;
         }
        if(y>=B->tu)
       break;
       }
     
       if(x<=A->tu)
       {
            while(x<=A->tu)
            {
                T->data[z].i=A->data[x].i;
                T->data[z].j=A->data[x].j;
                T->data[z].e=A->data[x].e;
                x++;z++; 
            }
       }
       if(y<=B->tu)
       {
            while(y<=B->tu){ 
                T->data[z].i=B->data[y].i;
                T->data[z].j=B->data[y].j;
                T->data[z].e=0-B->data[y].e;
                y++;z++; 
                           }
       }
  
   T->tu=z;
   Print(A,B,T);
}
Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有