数组和广义表的基本运算实现(三元组)
来源:互联网 发布:广西农产品出口数据 编辑:程序博客网 时间:2024/06/10 19:41
问题及代码:
a: b:
/** Copyright (c) 2016, 烟台大学计算机与控制工程学院* All rights reserved.* 文件名称:6-4.cpp* 作 者:单昕昕* 完成日期:2016年5月30日* 版 本 号:v1.0* 问题描述:假设n n的稀疏矩阵A采用三元组表示,设计一个程序exp6-4.cpp实现如下功能: (1)生成如下两个稀疏矩阵的三元组a和b; (2)输出a转置矩阵的三元组; (3)输出a+b的三元组; (4)输出a b的三元组。* 程序输入:无* 程序输出:如题。*/#include<cstdio>#include<cstring>#include<cmath>#include<set>#include<cstdlib>#include<iostream>#include<algorithm>using namespace std;#define M 4//行数#define N 4//列数#define MaxSize 1010//稀疏矩阵中非零元素最多个数typedef struct{ int r;//行号 int c;//列号 int d;//元素值} TupNode;//三元组定义typedef struct{ int rows;//行数 int cols;//列数 int nums;//非零元素个数 TupNode data[MaxSize];} TSMatrix;//三元组顺序表定义//以行序方式扫描稀疏矩阵A,将其非零元素插入到三元组t中void CreatMat(TSMatrix &t,int A[M][N]){ int i,j; t.rows=M,t.cols=N,t.nums=0; for(i=0; i<M; ++i)//行主序开始扫描 for(j=0; j<N; ++j) if(A[i][j])//只储存非零元素 { t.data[t.nums].r=i; t.data[t.nums].c=j; t.data[t.nums].d=A[i][j]; ++t.nums; }}//输出三元组void DisMat(TSMatrix t){ if(t.nums<=0) return; cout<<'\t'<<t.rows<<'\t'<<t.cols<<'\t'<<t.nums<<endl; cout<<'\t'<<"-------------------"<<endl; for(int i=0; i<t.nums; ++i) cout<<'\t'<<t.data[i].r<<'\t'<<t.data[i].c<<'\t'<<t.data[i].d<<endl;}//矩阵转置void TranTat(TSMatrix t,TSMatrix &tb){ int p,q=0,v; tb.rows=t.cols; tb.cols=t.rows; tb.nums=t.nums; if(t.nums!=0) for(v=0; v<t.cols; ++v) for(p=0; p<t.nums; ++p) if(t.data[p].c==v) { tb.data[q].r=t.data[p].c; tb.data[q].c=t.data[p].r; tb.data[q].d=t.data[p].d; ++q; }}//两个稀疏矩阵相加bool MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c){ int i=0,j=0,k=0; int v; if(a.rows!=b.rows||a.cols!=b.cols) return false; c.rows=a.rows,c.cols=a.cols; while(i<a.nums&&j<b.nums) { if(a.data[i].r==b.data[j].r) { if(a.data[i].c<b.data[j].c) { c.data[k].r=a.data[i].r; c.data[k].c=a.data[i].c; c.data[k].d=a.data[i].d; ++k,++i; } else if(a.data[i].c>b.data[j].c) { c.data[k].r=b.data[i].r; c.data[k].c=b.data[i].c; c.data[k].d=b.data[i].d; ++k,++j; } else { v=a.data[i].d+b.data[j].d; if(v) { c.data[k].r=a.data[i].r; c.data[k].c=a.data[i].c; c.data[k].d=v; ++k; } ++i,++j; } } else if(a.data[i].r<b.data[j].r) { c.data[k].r=a.data[i].r; c.data[k].c=a.data[i].c; c.data[k].d=a.data[i].d; ++k,++i; } else { c.data[k].r=b.data[i].r; c.data[k].c=b.data[i].c; c.data[k].d=b.data[i].d; ++k,++j; } c.nums=k; } return true;}//两个稀疏矩阵相乘void MatMul(int a[M][N],int b[M][N],int z[M][N]){ memset(z,0,sizeof(z)); int i,j,k; for (k=0; k<N; k++) for(i=0; i<N; i++) for (j=0; j<N; j++) z[i][k]+=a[i][j]*b[j][k];}TSMatrix a,b,c;int z[M][N];int main(){ int x[M][N]= {1,0,3,0, 0,1,0,0, 0,0,1,0, 0,0,1,1 }; int y[M][N]= {3,0,0,0, 0,4,0,0, 0,0,1,0, 0,0,0,2 }; CreatMat(a,x); cout<<"a的三元组:"<<endl; DisMat(a); CreatMat(b,y); cout<<"b的三元组:"<<endl; DisMat(b); cout<<"a转置为c"<<endl; TranTat(a,c); cout<<"c的三元组:"<<endl; DisMat(c); cout<<"c=a+b"<<endl; cout<<"c的三元组:"<<endl; if(MatAdd(a,b,c)) DisMat(c); cout<<"c=a×b"<<endl; cout<<"c的三元组:"<<endl; MatMul(x,y,z); /*for(int i=0; i<4; ++i) { for(int j=0; j<4; ++j) cout<<z[i][j]<<" "; cout<<endl; }*/ CreatMat(c,z); DisMat(c); return 0;}/*1 0 3 00 1 0 00 0 1 00 0 1 13 0 0 00 4 0 00 0 1 00 0 0 2*/
运行结果:
0 0
- 数组和广义表的基本运算实现(三元组)
- 数组和广义表的基本运算实现
- 数据结构 - 数组和广义表的基本运算实现
- 第6次数据结构上机(数组和广义表的基本运算实现)
- 实现广义表的基本运算
- 第九周 数据结构实践项目——数组和广义表【项目3.1-稀疏矩阵的三元组表示的实现及应用】
- 第八周(2) 数组和广义表 对称矩阵的压缩存储及基本运算
- 第八周(2) 数组和广义表 对称矩阵的压缩存储及基本运算
- 实现广义表的各种基本运算算法
- 三元组运算的实现
- 2015年大二上-数据结构-数组与广义表(3)-1.稀疏矩阵的三元组表示
- 2015年大二上-数据结构-数组与广义表(3)-2.稀疏矩阵的三元组表示
- 【数组与广义表项目3-2-稀疏矩阵的三元组的加法】
- !实现稀疏矩阵(采用三元组表示)的基本运算
- 数据结构--数组和广义表--以行逻辑链接的顺序表为存储结构的矩阵的基本运算(求矩阵乘积)
- c语言版数据结构(奇迹冬瓜)-数组和广义表(多维数组的基本操作)
- 广义表的基本实现
- 实现广义表求表头和表尾的运算
- 推荐系统_LFM和基于邻域(如UserCF、ItemCF)的方法的比较
- 二分图最大权匹配--KM算法模板
- 论文阅读记录: Automatic Image Colorization sig16
- java和objective-C对接笔记
- 基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案
- 数组和广义表的基本运算实现(三元组)
- 图的邻接表 表示 DFS 和BFS C++实现
- (面试)网络相关(不断丰富中…)
- 软件测试之BUG分析定位概述(QA如何分析定位BUG)
- vc画线画框画矩形
- UML 的九种模型图--UML建模基础知识
- 深度学习的几种库
- Java 关键字之static详解
- Redis使用优化技巧(java)