三元顺序表基本加法以及减法
来源:互联网 发布:模联会议软件 编辑:程序博客网 时间:2024/05/02 01:32
哎,数据结构的作业题,看来还是好弱,写了两小时,在加法那里算迷糊了,三元顺序表神马的,还是不知道拿来干嘛的,操作好难过的啊,贴下挫代码纪念纪念。
//三元组顺序表进行加法及乘法运算 #include<cstdio>#include<cstdlib>#include<cstring>#define max(a,b)(a>b?a:b)#define MAXSIZE 10005 typedef struct{//定义三元顺序表的元素内涵 int i,j;//所在行列 int e;//储存元素 }Triple; typedef struct{ Triple data[MAXSIZE];//三元顺序表 int rpos[MAXSIZE];//各行第一个非零元所在三元表中的位置(下标) int r,c,n;//代表三元顺序表表示的矩阵的行,列以及元素个数 }Tmatrix;void getTmatrix(Tmatrix &T,int matrix[105][105],int m,int n){ T.n=0, T.r=m, T.c=n; for(int i=1; i<=m; i++){ bool flag=true; for(int j=1; j<=n; j++)if(matrix[i][j]){ T.data[++T.n].i=i; T.data[T.n].j=j; T.data[T.n].e=matrix[i][j]; if(flag)T.rpos[i]=T.n;//储存每一行第一个非零元下标 flag=false; } if(flag)T.rpos[i]=T.n+1; } T.data[T.n+1].i=0x3f3f3f3f, T.data[T.n+1].j=0x3f3f3f3f; } void add(Tmatrix A,Tmatrix B, Tmatrix &C){//三元顺序表矩阵加法运算 if(A.r!=B.r||A.c!=B.c){ printf("两矩阵尺寸不相同,不可相加!\n"); return; } if(A.n==0&&B.n==0){ printf("该矩阵为空!\n"); return; } int a=1, b=1; C.n=0; C.r=A.r; C.c=A.c; A.data[A.n+1].i=A.r+1;//为了方便后面程序使用,使其不用特判 B.data[B.n+1].i=B.r+1; while(a<=A.n||b<=B.n){//从两个三元组顺序表同时开始记录 if(A.data[a].i==B.data[b].i){//两个三元组顺序表当前元素行标相同 if(A.data[a].j==B.data[b].j){//若列标也相同直接相加 C.data[++C.n].e=A.data[a].e+B.data[b].e; C.data[C.n].i=A.data[a].i; C.data[C.n].j=A.data[a].j; a++,b++; } else if(A.data[a].j>B.data[b].j){//若列标不同,按顺序先加小的 C.data[++C.n].e=B.data[b].e; C.data[C.n].i=B.data[b].i; C.data[C.n].j=B.data[b].j; b++; } else if(A.data[a].j<B.data[b].j){ C.data[++C.n].e=A.data[a].e; C.data[C.n].i=A.data[a].i; C.data[C.n].j=A.data[a].j; a++; } } else if(A.data[a].i<B.data[b].i){//行标小的先加 C.data[++C.n].e=A.data[a].e; C.data[C.n].i=A.data[a].i; C.data[C.n].j=A.data[a].j; a++; } else if(A.data[a].i>B.data[b].i){ C.data[++C.n].e=B.data[b].e; C.data[C.n].i=B.data[b].i; C.data[C.n].j=B.data[b].j; b++; } } printf("计算A+B后的矩阵为:\n"); for(int i=1,k=1; i<=C.r; i++){ for(int j=1; j<=C.c; j++){ if(C.data[k].i==i&&C.data[k].j==j)printf("%d ",C.data[k++].e); else printf("0 "); } printf("\n"); } printf("计算A+B后得到的三元顺序表C为:\n"); printf("i j e\n"); for(int i=1; i<=C.n; i++)printf("%d %d %d\n",C.data[i].i,C.data[i].j,C.data[i].e); printf("-------------------\n");}void mul(Tmatrix A, Tmatrix B, Tmatrix& C){ if(A.c!=B.r){ printf("该两个矩阵不可以相乘\n"); return; } if(A.n*B.n==0){ printf("该矩阵为空\n"); return; } int ctemp[105];//用来统计次算一行中的每个元素与所在列的元素乘积,其实也就是按矩阵乘法原理统计相乘后一行的每个元素 C.r=A.r; C.c=B.c; C.n=0; for(int arow=1; arow<=A.r; arow++){//处理A的每一行 memset(ctemp,0,sizeof(ctemp));//当前行的各个列上的累加器为0 C.rpos[arow]=C.n+1;//找到当前行第一个非零元素 int tp,tq;//用来保存每一行的最后一个元素在三元顺序表的位置 if(arow<A.r)tp=A.rpos[arow+1]-1; else tp=A.n; for(int p=A.rpos[arow]; p<=tp; p++){//开始进行对每行里的元素进行乘法运算 int brow=A.data[p].j;//根据矩阵乘法原则,A中的列标要找到B中对应的行标; if(brow<B.r)tq=B.rpos[brow+1]-1; else tq=B.n; for(int q=B.rpos[brow]; q<=tq; q++){ int col=B.data[q].j; //乘积元素在C中的列号 ctemp[col]+=A.data[p].e*B.data[q].e; } } //求出了C中第arow行的非零元 for(int col=1; col<=C.c; col++)if(ctemp[col]){//非零 C.data[++C.n].e=ctemp[col]; C.data[C.n].i=arow; C.data[C.n].j=col; } } printf("计算A+B后的矩阵为:\n"); for(int i=1,k=1; i<=C.r; i++){ for(int j=1; j<=C.c; j++){ if(C.data[k].i==i&&C.data[k].j==j)printf("%d ",C.data[k++].e); else printf("0 "); } printf("\n"); } printf("计算A+B后得到的三元顺序表C为:\n"); printf("i j e\n"); for(int i=1; i<=C.n; i++)printf("%d %d %d\n",C.data[i].i,C.data[i].j,C.data[i].e);}int main(){ int s[105][105]; int m,n; Tmatrix A,B,C,D; printf("请先输入稀疏矩阵A的行列数:\n"); scanf("%d %d",&m,&n); //稀疏矩阵A转化为三元顺序表: printf("请输入具体的矩阵A:\n"); for(int i=1; i<=m; i++) for(int j=1; j<=n; j++)scanf("%d",&s[i][j]); //printf("已将稀疏矩阵A转化为三元顺序表的形式.\n"); getTmatrix(A,s,m,n); //稀疏矩阵B转化为三元顺序表: printf("请输入稀疏矩阵B的行列数:\n"); scanf("%d %d",&m,&n); printf("请输入具体的矩阵B:\n"); for(int i=1; i<=m; i++) for(int j=1; j<=n; j++)scanf("%d",&s[i][j]); //printf("已经将稀疏矩阵B转化为三元顺序表的形式.\n"); getTmatrix(B,s,m,n); printf("__________________________________\n"); printf("进行矩阵A+B运算:\n"); add(A,B,C); printf("进行矩阵A*B运算:\n"); mul(A,B,D); system("pause"); return 0;}
- 三元顺序表基本加法以及减法
- 大数加法 以及 大数减法的思路
- 顺序结构、动态链表结构下的一元多项式的加法、减法等的实现
- 三元组创建矩阵 一次定位快速转置 矩阵的加法、减法、乘法
- 使用加法、减法以及一位来实现乘除法
- 大整数加法减法
- 高精度加法&高精度减法
- 二进制加法与减法
- 高精度加法与减法
- 大数减法、加法、乘法
- 大数加法和减法
- 大数加法与减法
- 大数加法、减法、乘法
- 定点加法,减法运算
- 大数加法(减法) C++
- 加法与减法
- 稀疏矩阵的三元组顺序表存储表示及基本操作
- 链表的应用:单元多项式的加法、减法、乘法
- [MySQL 工具]percona-toolkit使用(1)源码安装
- Ubuntu 常用命令
- BIOS和CMOS区别
- SpringMVC和Struts的区别
- Please ensure that adb is correctly located at问题解决
- 三元顺序表基本加法以及减法
- NetBeans更改默认JDK路径
- UML
- 开源镜像站
- C++设计模式之六--Facade门面模式
- linux下core文件调试方法
- ios 证书相关
- Git图形用户工具介绍及比较
- c++容易被忽视的细节序列 (一)