稀疏矩阵采用三元组存储,设计算法求两个矩阵的和。

来源:互联网 发布:opta数据查询 编辑:程序博客网 时间:2024/05/21 08:48

稀疏矩阵采用三元组存储,设计算法求两个矩阵的和。

看着提交时间快结束了,写一篇博客。

我感觉我代码的亮点是求和的时候,判断一下上一个三元表是否有,没有的话在新开辟一个,最后加完,用c++库函数排序一下,这样就可以输出了。

时间复杂度没仔细算(求大神点评),空间复杂度降低了。欢迎一起研究思路。

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <algorithm>using namespace std;#define MAX 100typedef struct {int i,j;int e;}Triple;typedef struct {Triple data[MAX+1];int mu,nu,tu;//矩阵的行数、列数、和非零元个数 }TSMatrix;bool cmp(Triple a,Triple b){//降序排一下 if(a.i==b.i)//如果他们横坐标相同,按纵坐标排一下 {return a.j<b.j;}else {return a.i<b.i;}}void Input(TSMatrix &T){//输入 int tmp;for(int i=1;i<=T.mu;i++){for(int j=1;j<=T.nu;j++){scanf("%d",&tmp);if(tmp!=0)//非0元素就保存 {T.data[T.tu].i=i;T.data[T.tu].j=j;T.data[T.tu].e=tmp;T.tu++;}}}}void Output(TSMatrix T){//输出 int i,j,k=0;for(i=1;i<=T.mu;i++){for(j=1;j<=T.nu;j++){if(T.data[k].i==i&&T.data[k].j==j){printf("%d ",T.data[k++].e);}elseprintf("0 ");}putchar('\n');}}int jdg(Triple q,TSMatrix T1,int &tmp_k){//判断此位置是否有非0元素 int flag=0;for(int i=0;i<T1.tu;i++){if(T1.data[i].i==q.i&&T1.data[i].j==q.j){tmp_k=i;flag=1;break;}}if(flag)return 1;return 0;}void sum(TSMatrix &T1,TSMatrix T2){int k=0,tmp_k;for(int i=0;i<T2.tu;i++){if(jdg(T2.data[i],T1,tmp_k))//判断这个位置T1有没有 {T1.data[tmp_k].e+=T2.data[i].e;//这个位置有,直接加上 }else//这个位置没有开辟一下 {T1.data[T1.tu].i=T2.data[i].i;T1.data[T1.tu].j=T2.data[i].j;T1.data[T1.tu++].e=T2.data[i].e;}}sort(T1.data,T1.data+T1.tu,cmp);//进行排序一下,方便输出 }int main(){TSMatrix T1,T2;int tmp,q=0;printf("请输入矩阵的行数和列数\n");scanf("%d%d",&T1.mu,&T1.nu);T2.mu=T1.mu;T2.nu=T1.nu;T1.tu=0;printf("请输入矩阵T1\n");Input(T1);//Output(T1);T2.tu=0;printf("请输入矩阵T2\n");Input(T2);//Output(T2);sum(T1,T2);Output(T1);return 0;}


0 0
原创粉丝点击