稀疏矩陣及其轉置

 

*************************************************SparseMatrix.h***********************************************

#include <iostream>

using namespace std;

const int maxNum=100;

template <class T>
class Trituple
{
public:
int row;
int col;
T data;
};

template <class T>
class SparseMatrix
{
friend istream& operator >>(istream& in,SparseMatrix<T> &m)                       //重載輸入運算符
{
   cout<<"請輸入行數,列數以及非零元素個數:";                               //初始化稀疏矩陣的行、列以及非零元素的個數
   in>>m.row>>m.col>>m.terms;
   if(m.terms>m.maxTerms)
   {
    cout<<"錯誤!非零元素溢出!";
   }
   else
   {
    for(int i=0;i<m.terms;i++)
    {
     cout<<"請輸入第"<<i+1<<"個非零元素的行數,列數以及非零元素的值:";    //通過初始化三元組來初始化矩陣
     in>>m.t[i].row>>m.t[i].col>>m.t[i].data;
     while((m.t[i].row>=m.row)||(m.t[i].col>=m.col))                              //矩陣元素下標檢查
     {
      cout<<"錯誤!輸入的矩陣元素下標越界!請從新輸入:";
      in>>m.t[i].row>>m.t[i].col>>m.t[i].data;
     }
    }
   }
   return in;
}
friend ostream& operator <<(ostream& out,SparseMatrix<T> &m)                              //重載輸出運算符
{
   int i,j,k=0;
   out<<"行:"<<m.row<<" 列:"<<m.col<<" 非零元素個數:"<<m.terms<<endl;
   /*for(int i=0;i<m.terms;i++)
   {
    out<<"M["<<m.t[i].row<<"]["<<m.t[i].col<<"]="<<m.t[i].data<<endl;                 //以 M[行][列] 的形式輸出稀疏矩陣
   }*/
   for(i=0;i<m.row;i++)
   {
    for(j=0;j<m.col;j++)
    {
     if((m.t[k].row==i)&&(m.t[k].col==j))
     {
        out<<m.t[k++].data<<" ";
       }
       else
       {
        cout<<'0'<<" ";
       }
    }
            out<<endl;
   }

   return out;
}

private:
int row;
int col;
int terms;
    Trituple<T> *t;           //三元組數組
int maxTerms;             //最大元素數目
public:
SparseMatrix(int maxSize=maxNum)                   //構造函數
{
   maxTerms=maxSize;
   row=col=terms=0;
   t=new Trituple<T>[maxSize];
}
~SparseMatrix()                                    //析構函數
{
   delete []t;
}
/*SparseMatrix<T> transposedMatrix()                    //課本上的矩陣轉置函數,邏輯正確,但是運行時內存報錯
{
   int *rowSize=new int[col];                        //存放轉置矩陣各行中的非零元素個數
   int *rowStart=new int[col];                       //存放轉置矩陣各行中非零元素開始的存放位置
   SparseMatrix<T> tp(maxTerms);                     //存放轉置後的矩陣
   tp.row=col;
   tp.col=row;
   tp.terms=terms;
   if(terms>0)
   {
      int i=0;
      int j=0;
      for(i=0;i<col;i++)                              //初始化rowSize
     rowSize=0;
      for(i=0;i<terms;i++)
     rowSize[t[i].col]++;
      rowStart[0]=0;
      for(i=1;i<maxTerms;i++)                         //初始化rowStart
       rowStart[i]=rowSize[i]+rowStart[i-1];
      //*****************************************
      for(i=0;i<col;i++)
       cout<<rowSize[i]<<" ";
      cout<<endl;
      for(i=0;i<col;i++)
       cout<<rowStart[i]<<" ";
      cout<<endl;
      //******************************************
      for(i=0;i<terms;i++)
      {
       j=rowStart[t[i].col];                          //j轉置矩陣的三元組的行
       //rowStart[t[i].col]++;
       tp.t[j].row=t[i].col;
       tp.t[j].col=t[i].row;
       tp.t[j].data=t[i].data;
     rowStart[t[i].col]++;
      }
   }
   delete []rowSize;
        delete []rowStart;
     return tp;
}*/
    void transposedMatrix(SparseMatrix &tp)                 //自己編寫的轉置矩陣函數
{
   int i,j;
   if(terms>0)
   {
    int Row=0;
    tp.col=row;                                     //初始化轉置矩陣的行、列以及非零元素個數
    tp.row=col;
    tp.terms=terms;   
    for(j=0;j<col;j++)                              //從第0列開始檢查
    {
          for(i=0;i<terms;i++)
     {
        if(t[i].col==j)                         //檢查原三元組的列,如果相同,則交換行、列賦值給轉置矩陣
        {
               tp.t[Row].row=t[i].col;
               tp.t[Row].col=t[i].row;
               tp.t[Row].data=t[i].data;
       Row++;
              }
     }
    }
   }
}
/*void displayTrituple()                                  //輸出三元組
{
   for(int i=0;i<terms;i++)
   {
    cout<<t[i];
   }
   cout<<endl;
}*/
};

*******************************************SparseMatrixMain.cpp*************************************************

#include "stdafx.h"
#include <iostream>
//#include "Trituple.h"
#include "SparseMatrix.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
SparseMatrix<int> obj;
SparseMatrix<int> obj1;
cin>>obj;
//obj.displayTrituple();                     //測試時使用的輸出三元組的函數
cout<<"*********************初始矩陣**********************"<<endl;
cout<<obj;
obj.transposedMatrix(obj1);                  //調用自己編寫的轉置函數
//obj.transposedMatrix();                    //調用課本的轉置函數
cout<<"*********************轉置矩陣**********************"<<endl;
cout<<obj1;                                 
//cout<<obj;
return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章