码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-10-19 21:17:57      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   ar   for   sp   数据   div   log   

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

             思路:

                         首先规范好输入情况

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

                                                                                   )

                         

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

                          数组的加法,减法(

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

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

                                                          输出结果为矩阵

                                                         )

   思路实现

       

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

                                                                                   )

                         

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 ),具体思路如下

1 1
2 2 2
3 3 3

 x

 vaule
     

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

1 1
5 2
9 3
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 = 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 = 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 = 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 = 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 = A->data[i].value;
             i++;
       }
   }//if-else

   C->nums++;

   return C;
}//AddMatrix

 

                            

 

 

 

 

               

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

标签:style   blog   color   ar   for   sp   数据   div   log   

原文地址:http://www.cnblogs.com/dilidingzhi/p/4028665.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!