稀疏矩阵三元组顺序表
2015-06-03 09:22
162 查看
有这样一种矩阵,大多数元素的值为零,只有少部分为非零元素。而这些非零元素在矩阵中的分布又没有明显的规律,这种矩阵称为稀疏矩阵。本文才有顺序组织来存储稀疏矩阵,存取稀疏矩阵非零元素需要三个参数,行号、列号和数据值。
本文实现了稀疏矩阵的构造和转置以及显示。
thrinode.h
本文实现了稀疏矩阵的构造和转置以及显示。
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();//输出显示 }; #endifthrinode.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; }结果:
相关文章推荐
- Android新控件RecyclerView浅析及上拉和下拉刷新
- HDU 超级楼梯
- 2015.6.3立体雷族的抽象类
- 程序员技术练级攻略
- 解读ASP.NET 5 & MVC6系列(17):MVC中的其他新特性
- 正则
- java内存管理机制
- 什么是JSON?
- 记一次云计算测试实验-openstack-icehouse-安装nova
- ie6并不是不支持!important
- JNI快速入门
- 第13周 项目3 立体类族共有的抽象类
- 矩形覆盖
- java实现附件预览(openoffice+swftools+flexpaper)(解决jsp读取全盘文件问题)
- 【scikit-learn】scikit-learn的线性回归模型
- Linux服务架设篇--ping命令
- 第十三周【项目 - 链表类】
- 第十三周项目一 动物叫声 2
- windows下Python3配置beautifulsoup4
- 第十三周 程序阅读 (2)虚析构函数