实验题目:
假设n n的稀疏矩阵A采用三元组表示,设计一个程序exp6-4.cpp实现如下功能:
(1)生成如下两个稀疏矩阵的三元组a和b;
(2)输出a转置矩阵的三元组;
(3)输出a+b的三元组;
(4)输出a b的三元组。
源码:
#include <iostream>
#define M 4
#define N 4
#define MaxSize 100
struct TupNode
{
int r;
int c;
int d;
};
struct TSMatrix
{
int rows;
int cols;
int nums;
TupNode data[MaxSize];
};
using namespace std;
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]!=0)
{
t.data[t.nums].r=i;t.data[t.nums].c=j;
t.data[t.nums].d=A[i][j];t.nums++;
}
}
}
bool Value(TSMatrix &t,int x, int i, int j) //三元组元素赋值
{
int k=0,k1;
if(i>=t.rows || j>=t.cols)
return false;
while(k<t.nums && i>t.data[k].r)
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 DispMat(TSMatrix t) //输出三元组
{
int i;
if (t.nums<=0)
return;
cout<<t.rows<<" "<<t.cols<<" "<<t.nums<<endl;
cout<<"------------------"<<endl;
for (i=0; i<t.nums; i++)
cout<<t.data[i].r<<" "<<t.data[i].c<<" "<<t.data[i].d<<endl;
cout<<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++;
}
}
}
int 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 0;
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[j].r;
c.data[k].c=b.data[j].c;
c.data[k].d=b.data[j].d;
k++;j++;
}
else
{
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)
{
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 1;
}
int getvalue(TSMatrix c,int i,int j)
{
int k=0;
while (k<c.nums && (c.data[k].r!=i || c.data[k].c!=j))
k++;
if (k<c.nums)
return(c.data[k].d);
else
return(0);
}
bool MatMul(TSMatrix a,TSMatrix b,TSMatrix &c) //矩阵相乘
{
int i,j,k,p=0;
int s;
if (a.cols!=b.rows)
return false;
for (i=0;i<a.rows;i++)
for (j=0;j<b.cols;j++)
{
s=0;
for (k=0;k<a.cols;k++)
s=s+getvalue(a,i,k)*getvalue(b,k,j);
if (s!=0)
{
c.data[p].r=i;
c.data[p].c=j;
c.data[p].d=s;
p++;
}
}
c.rows=a.rows;
c.cols=b.cols;
c.nums=p;
return true;
}
int main()
{
TSMatrix ta,tb,tc;
int A[4][4]= {{1,0,3,0},{0,1,0,0},{0,0,1,0},{0,0,1,1}};
int B[4][4]= {{3,0,0,0},{0,4,0,0},{0,0,1,0},{0,0,0,2}};
cout<<"A的三元组:"<<endl;
CreatMat(ta,A);
DispMat(ta);
cout<<"B的三元组:"<<endl;
CreatMat(tb,B);
DispMat(tb);
cout<<"A转置为C:"<<endl;
TranTat(ta,tc);
DispMat(tc);
cout<<"C=A+B:"<<endl;
MatAdd(ta,tb,tc);
DispMat(tc);
cout<<"C=A*B:"<<endl;
MatMul(ta,tb,tc);
DispMat(tc);
return 0;
}