您的位置:首页 > 其它

稀疏矩阵三元组顺序表

2015-06-03 09:22 162 查看
有这样一种矩阵,大多数元素的值为零,只有少部分为非零元素。而这些非零元素在矩阵中的分布又没有明显的规律,这种矩阵称为稀疏矩阵。本文才有顺序组织来存储稀疏矩阵,存取稀疏矩阵非零元素需要三个参数,行号、列号和数据值。

本文实现了稀疏矩阵的构造和转置以及显示。

thrinode.h

#ifndef THRINODE_H_
#define THRINODE_H_
const int MAXSIZE=50;
typedef int ElemType;
//定义三元组结构体
struct Thrinode
{
int i;//非零元素的行号
int j;//非零元素的列号
ElemType v;//非零元素的数据值
};
//三元表类定义
class SqMatrix
{
private:
int m;//矩阵的总行数
int n;//矩阵的总列数
int t;//非零元素的个数
Thrinode data[MAXSIZE];//三元组表
public:
SqMatrix();//构造函数
void Create();//输入建立一个矩阵
SqMatrix TransmatOne();//转置方法1
SqMatrix Transmatone();//装置方法1的另一种方式
void showMatrix();//输出显示
};
#endif
thrinode.cpp

#include "stdafx.h"
#include "thrinode.h"
#include <iostream>
#include <iomanip>
using std::cout;
using std::cin;
using std::endl;
SqMatrix::SqMatrix()//构造函数
{
m=0; n=0; t=0;
//初始化一个空三元组表
for(int p=0; p<t; p++)
{
data[p].i=0;
data[p].j=0;
data[p].v=0;
}
}
void SqMatrix::Create()//输入建立一个矩阵
{
cout<<"请输入您要创建的稀疏矩阵维数:"<<endl;
cout<<"总行数 m = ";cin>>m;
cout<<"总列数 n = "; cin>>n;
cout<<"非零元素总个数 t = ";cin>>t;
cout<<"**********************************"<<endl;
for(int p=0; p<t; p++)
{
cout<<"第"<<p+1<<"个元素为:"<<endl;
cout<<"行号:i = ";
cin>>data[p].i;
cout<<"列号:j = ";
cin>>data[p].j;
cout<<"元素值:v = ";
cin>>data[p].v;
}
cout<<"矩阵创建完毕!"<<endl;
}

SqMatrix SqMatrix::TransmatOne()//转置方法1
{
SqMatrix b;
cout<<"按矩阵的列序转置开始"<<endl;
b.m=n; b.n=m; b.t=t;
if(t!=0)
{
int q=0;
for(int col=1; col<=n; col++)
{
for(int p=0; p<t; p++)
{
if(data[p].j==col)
{
b.data[q].j=data[p].i;
b.data[q].i=data[p].j;
b.data[q].v=data[p].v;
++q;

}
}
}
cout<<"转置已经完成"<<endl;
return b;
}
}
SqMatrix SqMatrix::Transmatone()//装置方法1的另一种方式
{
SqMatrix b;
b.m=m; b.n=n; b.t=t;
if(t!=0)
{//
cout<<"按矩阵的行序转置开始:"<<endl;
for(int p=1; p<=m; p++)
{
for(int q=0; q<=t; q++)
{
if(p==data[q].i)
{
b.data[q].i=data[q].j;
b.data[q].j=data[q].i;
b.data[q].v=data[q].v;
}
}
}
cout<<"转置变换结束。。。"<<endl;
}
return b;
}
void SqMatrix::showMatrix()//输出显示
{
for(int i=1; i<=m; i++)
{
for(int j=1; j<=n; j++)
{
bool isFound=false;
int foundIndex=0;
for(int p=0; p<t; p++)
{

if(data[p].i==i && data[p].j==j)
{
isFound=true;
foundIndex=p;
//cout<<std::setw(5)<<data[p].v;
}
}
if(isFound==true)
{
cout<<std::setw(5)<<data[foundIndex].v;
}
else
{
cout<<std::setw(5)<<0;
}
}
cout<<endl;
}
}
main.cpp

// main.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include "thrinode.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
SqMatrix Matrix;
Matrix.Create();
Matrix.showMatrix();
SqMatrix TM=Matrix.TransmatOne();
TM.showMatrix();
SqMatrix TMD=Matrix.Transmatone();
TMD.showMatrix();
system("pause");
return 0;
}
结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: