您的位置:首页 > 其它

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

2016-10-16 22:00 197 查看
稀疏矩阵采用三元组存储,设计算法求两个矩阵的和。

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

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

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

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;

#define MAX 100

typedef 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);
}
else
printf("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
4000
);//进行排序一下,方便输出
}

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: