题目要求:
假设n n的稀疏矩阵A采用三元组表示,设计一个程序exp6-4.cpp实现如下功能:
(1)生成如下两个稀疏矩阵的三元组a和b;
(2)输出a转置矩阵的三元组;
(3)输出a+b的三元组;
(4)输出a b的三元组。
输入代码:
#include<iostream>
#include<stdio.h>
#include<malloc.h>
using namespace std;
#define M 4//稀疏矩阵行数
#define N 4//稀疏矩阵列数
#define MaxSize 100//稀疏矩阵中非零元素最多的个数
int z[M][N];
typedef int ElemType;
typedef struct
{
int r;//行号
int c;//列号
ElemType d;//元素值
} TupNode;
typedef struct
{
int rows;//行数
int cols;//列数
int nums;//非零元素个数
TupNode data[MaxSize];
} TSMatrix; //三元组顺序表定义
/*
对一个二维稀疏矩阵创建其三元组表示
*/
void CreatMat(TSMatrix &t,ElemType 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]!=0)//只存贮非零元素
{
t.data[t.nums].r=i;
t.data[t.nums].c=j;
t.data[t.nums].d=A[i][j];
t.nums++;
}
}
}
/*
输出三元组
*/
void DispMat(TSMatrix t)
{
int i;
if(t.nums<=0)//没有非零元素时返回
{
return ;
}
printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.nums);
printf("\t----------------------\n");
for(i=0; i<t.nums; i++)
{
printf("\t%d\t%d\t%d\n",t.data[i].r,t.data[i].c,t.data[i].d);
}
}
/*
三元组元素赋值
*/
bool Value(TSMatrix &t,ElemType x,int i,int j)
{
int k=0,k1;
if(i>=t.rows||j>=t.rows)
return false;
while(k<t.nums&&t.data[k].r<i)//查找行
k++;
while(k<t.nums&&i==t.data[k].r&&j>t.data[k].c)//查找列
k++;
if(t.data[k].r==i&&t.data[k].c==j)//存在这样的元素
t.data[k].d=x;
else
{
for(k1=t.nums-1; k1>=k; k1--)
{
t.data[k1+1].r=t.data[k1].r;
t.data[k1+1].c=t.data[k1].c;
t.data[k1+1].d=t.data[k1].d;
}
t.data[k].r=i;
t.data[k].c=j;
t.data[k].d=x;
t.nums++;
}
return true;
}
/*
矩阵转置
*/
void TranTat(TSMatrix t,TSMatrix &tb)
{
int p,q=0,v;//q为tb.data的下标
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;
ElemType v;
if(a.rows!=b.rows||a.cols!=b.cols)
return false;
c.rows=a.rows;
c.cols=a.cols;//c的行列数与a的相同
while(i<a.nums&&j<b.nums)//处理a和b的每一个元素
{
if(a.data[i].r==b.data[j].r)//行号相同
{
if(a.data[i].c<b.data[j].c)//a元素的列号小宇b元素的列号
{
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)//a元素的列号大于b元素的列号
{
c.data[k].r=b.data[j].r;
c.data[k].c=b.data[j].c;
c.data[k].d=b.data[j].d;
k++;
j++;
}
else//a元素的列号等于b元素的列号
{
v=a.data[i].d+b.data[j].d;
if(v!=0)
{
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)//a元素的行号小于b元素的行号
{
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[j].r;
c.data[k].c=b.data[j].c;
c.data[k].d=b.data[j].d;
k++;
j++;
}
c.nums=k;
}
return true;
}
/*
两个稀疏矩阵相乘的运算
*/
void MatMul(int a[M][N],int b[M][N],int z[M][N])
{
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];
}
int main()
{
int A1[M][N]= {{1,0,3,0},{0,1,0,0},{0,0,1,0},{0,0,1,1}};
int B1[M][N]= {{3,0,0,0},{0,4,0,0},{0,0,1,0},{0,0,0,2}};
TSMatrix a,b,c;
CreatMat(a,A1);
CreatMat(b,B1);
cout<<"a的三元组: "<<endl;
DispMat(a);
cout<<"b的三元组: "<<endl;
DispMat(b);
cout<<"a转置为c:"<<endl;
TranTat(a,c);
cout<<"c的三元组: "<<endl;
DispMat(c);
cout<<"c=a+b: "<<endl;
MatAdd(a,b,c);
cout<<"c的三元组: "<<endl;
DispMat(c);
cout<<"c=a*b: "<<endl;
MatMul(A1,B1,z);
CreatMat(c,z);a
cout<<"c的三元组: "<<endl;
DispMat(c);
return 0;
}
运行截图: