首页 > 代码库 > 稀疏矩阵三元存储下的计算器

稀疏矩阵三元存储下的计算器

又是一个实验题:三元数组存储稀疏矩阵,同时实现基本的加法,减法,乘法,求逆

             思路:

                         首先规范好输入情况

                         明确三元数组的数据结构和输入特征(   行优先输入 

                                                                                   )

                         

                          将稀疏矩阵建立成三元数组和三元数组转化输出

                          数组的加法,减法(

                                                         根据输入的行与列来判断是否可以进行 

                                                         最后的运算结果仍是稀疏矩阵 

                                                          输出结果为矩阵

                                                         )

   思路实现

       

                         明确三元数组的数据结构和输入特征(   行优先输入 

                                                                                   )

                         

typedef struct {    int row;    int col;    ElementType value;}Triple;typedef struct {    Triple data[MAXSIZE];    int rows,cols,nums;//非零起}TSMatrix;

 

                          将稀疏矩阵建立成三元数组和三元数组转化输出

PtrTSMatrix CreatMatrix( void ){    int count = 0;     PtrTSMatrix Matrix;    Matrix  = ( PtrTSMatrix )malloc( sizeof( TSMatrix ) );     if( Matrix == NULL )     {         printf("Not Space\n ");         exit( 0 );     }     printf("输入行与列\n");     scanf("%d%d",&Matrix->rows,&Matrix->cols);     printf("输入矩阵的元素的行,列,值( -1 结束 ,行优先)\n");     scanf("%d%d%d",&Matrix->data[count].row,&Matrix->data[count].col,&Matrix->data[count].value);     while( Matrix->data[count].row != -1 )     {         count++;         scanf("%d%d%d",&Matrix->data[count].row,&Matrix->data[count].col,&Matrix->data[count].value);         if( Matrix->data[count].row < Matrix->data[count-1].row && Matrix->data[count].row!=-1 )        {            printf("未按行输出:\n");            getchar();            exit(0);        }//if     }//while    Matrix->nums = count;     return Matrix;}/* CreatMatrix *//* print the matrix Matrix by using matrix */void PrintMatrix( PtrTSMatrix Matrix ){      int i,j;      int count = 0;            for( i=0; i<Matrix->rows; i++ )      {          for( j=0; j<Matrix->cols; j++ )          {              if( count<Matrix->nums && i==Matrix->data[count].row-1 && j==Matrix->data[count].col-1 )              {                  printf("%2d",Matrix->data[count].value);                  count++;              }              else              {                  printf("%2d",0);              }//if-else          }//for          printf("\n");      }//for}/* PrintMatrix */PtrTSMatrix CreatMatrix( void ){    int count = 0;     PtrTSMatrix Matrix;    Matrix  = ( PtrTSMatrix )malloc( sizeof( TSMatrix ) );     if( Matrix == NULL )     {         printf("Not Space\n ");         exit( 0 );     }     printf("输入行与列\n");     scanf("%d%d",&Matrix->rows,&Matrix->cols);     printf("输入矩阵的元素的行,列,值( -1 结束 ,行优先)\n");     scanf("%d%d%d",&Matrix->data[count].row,&Matrix->data[count].col,&Matrix->data[count].value);     while( Matrix->data[count].row != -1 )     {         count++;         scanf("%d%d%d",&Matrix->data[count].row,&Matrix->data[count].col,&Matrix->data[count].value);         if( Matrix->data[count].row < Matrix->data[count-1].row && Matrix->data[count].row!=-1 )        {            printf("未按行输出:\n");            getchar();            exit(0);        }//if     }//while    Matrix->nums = count;     return Matrix;}/* CreatMatrix */

 

                          数组的加法,减法(

                                                         根据输入的行与列来判断是否可以进行 

                                                         最后的运算结果仍是稀疏矩阵 

                                                        )

     一般人最先想到的是两个for循环吧,那么算法的效率为 O( M *N ),我将算法稍稍改进了一下,优化到了 O(M+N ),具体思路如下

11
222
333

 x

 vaule
   

 类似上面那个三元组,在一个矩阵中想要确认位置需要x,y两个数据,实际上我可以把它回归到它在内存中存储得形式,即是线性存储,每一元素有唯一得一个对应值(假设矩阵为3×3),这样在就可以在一次循环中比较了

11
52
93
flag vaule 
  

                       

              while( 没有一个三元组被遍历完 )

               {

                          if(俩个三元组位置相同)

                          {

                                 将两个三元组得位置信息和和传递给新的三元组

                                 两个三元组都向后移一位

                         }

                        elseif(  其中一个三元组的元素在另一个之前 )

                        {

                               将位于前面得元素的位置信息和值传给新得三元组

                               向后移一位

                          }

              } 

 

  

/* Plus A and B ,return C */PtrTSMatrix AddMatrix( PtrTSMatrix A, PtrTSMatrix B ){    int i=0,j=0;//标记追逐 A  B     PtrTSMatrix C;//存放和   if( A->rows!=B->rows || A->cols!=B->cols )   {       return NULL;   }      C = ( PtrTSMatrix )malloc(sizeof( TSMatrix ));   C->rows = A->rows;   C->cols = A->cols;   C->nums = -1; //初始化      while( i<A->nums && j<B->nums )   {       if( A->data[i].row*A->cols+A->data[i].col == B->data[j].row*B->cols+B->data[j].col )       {           if( A->data[i].value+B->data[j].value != 0 )           {             C->nums++;             C->data[C->nums].col = A->data[i].col;             C->data[C->nums].row = A->data[i].row;             C->data[C->nums].value = http://www.mamicode.com/A->data[i].value+B->data[j].value;           }           i++;           j++;//标记后移       }       else if( A->data[i].row*A->cols+A->data[i].col < B->data[j].row*B->cols+B->data[j].col )       {             C->nums++;             C->data[C->nums].col = A->data[i].col;             C->data[C->nums].row = A->data[i].row;             C->data[C->nums].value = http://www.mamicode.com/A->data[i].value;             i++;       }       else       {             C->nums++;             C->data[C->nums].col = B->data[j].col;             C->data[C->nums].row = B->data[j].row;             C->data[C->nums].value = http://www.mamicode.com/B->data[j].value;             j++;       }//if-else   }//while,   if( i == A->nums )   {       while( j < B->nums )       {             C->nums++;             C->data[C->nums].col = B->data[j].col;             C->data[C->nums].row = B->data[j].row;             C->data[C->nums].value = http://www.mamicode.com/B->data[j].value;             j++;       }   }   else    {       while( i < A->nums )       {             C->nums++;             C->data[C->nums].col = A->data[i].col;             C->data[C->nums].row = A->data[i].row;             C->data[C->nums].value = http://www.mamicode.com/A->data[i].value;             i++;       }   }//if-else   C->nums++;   return C;}//AddMatrix

 

                            

 

 

 

 

               

稀疏矩阵三元存储下的计算器