稀疏矩阵三元组顺序表

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

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

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;
}
结果:



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值