数据结构稀疏矩阵的实现及转置

来源:互联网 发布:气味图书馆淘宝 编辑:程序博客网 时间:2024/05/23 22:06

     昨天在机房没有做出来,我想了很久,都不知道原因。在机房时就是不明白那些Triple和TSMatrix结构之间的联系。不知道如何进行数据输入和输出。

      且我一直在思考如果创建矩阵成功,又如何将其可视化的输出呢,就像我们看数学课本上的矩阵那样。今天晚上才明白过了。三元组顺序表实际是将看似非线性的矩阵实现了线性化的存储。不过现在看来我真正理解那个矩阵转置算法还需花时间。数据结构与算法的这个矩阵利用三元组顺序表实现线性存储让我明白了计算机是如此的傻瓜和伟大。记得去年这个时候我还在一直困惑着“计算机如何利用0和1实现存储图像、音乐、视频等,这完全不可能吧”,现在我学了数据结构与算法的一点皮毛,让我彻底相信计算机仅仅利用0和1是可以实现这些的,且完全有可能做更多的事情。


下面是利用三元组顺序表创建矩阵、存储和进行矩阵转置的代码:

#include<iostream>#include<iomanip>using namespace std;#define MAXSIZE 12500typedef struct{int i,j;//该非零元的行下标和列下标int e;}Triple;typedef struct{Triple data[MAXSIZE+1];//非零元三元组表,data[0]未用int mu,nu,tu;//矩阵的行数,列数和非零元个数}TSMatrix;void initTS(TSMatrix &X){cout<<"请输入你要创建的矩阵的行数列数和非零元个数"<<endl;cin>>X.mu>>X.nu>>X.tu;cout<<"您要创建的矩阵的行数、列数、和非零元个数分别为:"<<X.mu<<" "<<X.nu<<" "<<X.tu<<endl;int p;cout<<"现在开始输入矩阵的元素了!请在输完一个元素后回车(*^__^*) \a"<<endl;for(p=1;p<=X.tu;p++)//构造循环,直到输完所有非零元素结束{cout<<"请输入第 "<<p<<"个非零元素的行数:";cin>>X.data[p].i;cout<<"请输入列数:";cin>>X.data[p].j;cout<<"请输入具体的数值:";cin>>X.data[p].e;cout<<endl;}}void print(TSMatrix X){cout<<"现在的矩阵为:"<<endl;for(int k=1;k<=X.tu;k++){cout<<"矩阵的行数  "<<"矩阵的列数  "<<"内容"<<endl;cout<<setw(8)<<X.data[k].i<<setw(8)<<X.data[k].j<<setw(8)<<X.data[k].e<<endl;}}void TransposeSM(TSMatrix X,TSMatrix &T){cout<<"正在对矩阵进行转置!"<<endl;T.mu=X.nu;T.nu=X.mu;T.tu=X.tu;if(T.tu){int q=1;for(int col=1;col<=X.nu;++col)//注意不忘了等于for(int p=1;p<=X.tu;++p)if(X.data[p].j==col){T.data[q].i=X.data[p].j;T.data[q].j=X.data[p].i;T.data[q].e=X.data[p].e;++q;}}}int main(){TSMatrix X,T;initTS(X);print(X);TransposeSM(X,T);cout<<"矩阵X的转置矩阵为:"<<endl;print(T);return 0;}




网上 收集的代码参考:

//.......SparseMatrix.h#include<iostream.h>#include<stdio.h>#define MAXSIZE 12500typedef struct{ int i,j;//非0元素的行下标,列下标 int e;//非0元素的值}Triple;typedef struct{ Triple data[MAXSIZE]; int mu,nu,tu;//稀疏矩阵的行数,列数和非0元素个数}TSMatrix;//--------------------------------------------------------------//创建稀疏矩阵//--------------------------------------------------------------void CreateSMatrix(TSMatrix &M){ int num;//非0元素的个数 int m;//遍历矩阵的字符 int Rnum,Cnum;//稀疏矩阵的行数,列数 int row,col,a;//非0元素的行下标,列下标,值 cout<<"请输入系数矩阵非0元素的个数,num= "; cin>>num; cout<<"\n\n------------------------------\n"; M.tu =num; cout<<"请输入稀疏矩阵的行数,Rnum= "; cin>>Rnum; M.mu =Rnum; cout<<"\n------------------------------\n"; cout<<"请输入稀疏矩阵的列数,Cnum= "; cin>>Cnum; M.nu =Cnum; cout<<"\n------------------------------\n"; for(m=0;m<num;m++) {  cout<<"第"<<m+1<<"个非0元素是:\n";  cout<<"行数 ";  cin>>row;  cout<<"\n------------------------------\n";  cout<<"列数 ";  cin>>col;  cout<<"\n------------------------------\n";  cout<<"值 ";  cin>>a;  cout<<"\n------------------------------\n\n";  M.data[m].i =row;  M.data[m].j =col;  M.data[m].e =a; }// M.tu =num;}//--------------------------------------------------------------//输出稀疏矩阵//--------------------------------------------------------------void PrintSMatrix(TSMatrix M){ int n; cout<<"稀疏矩阵是: \n"; cout<<"i  "<<"j  "<<"e  \n"; for(n=0;n<M.tu;n++) {  cout<<M.data[n].i<<"  "<<M.data[n].j <<"  "<<M.data[n].e<<endl; }}//--------------------------------------------------------------//稀疏矩阵转置//--------------------------------------------------------------bool TransposeSMatrix(TSMatrix M,TSMatrix &T){ int q;//矩阵T的数组下标 int p;//遍历矩阵M的字符 int col;//矩阵M的列数 T.mu =M.nu ; T.nu =M.mu ; T.tu =M.tu ; if(T.tu ) {  q=0;  for(col=1;col<=M.nu ;col++)   for(p=0;p<M.tu ;p++)    if(M.data[p].j==col)    {     T.data[q].i =M.data[p].j;     T.data[q].j =M.data[p].i;     T.data[q].e =M.data[p].e;     q++;    } } return true; return false;}//----------------------------------------------------------------------//稀疏矩阵转置—2//----------------------------------------------------------------------///.....main.cpp//#include"SparseMatrix.h"void main(){ TSMatrix M,T; CreateSMatrix(M); PrintSMatrix(M); cout<<"矩阵M转置后:"; cout<<"\n\n----------------------------\n\n"; if(TransposeSMatrix(M,T))  PrintSMatrix(T); getchar();}


原创粉丝点击