![]() |
#2
liucs1162010-11-27 15:18
|

#include<iostream>
using namespace std;
#define MaxSize 100 //用户自定义
#define M 100
#define N 100
typedef int ElemType; //用户自定义
typedef struct
{
//定义三元组
int i;
int j;
ElemType value;
} TripleNode;
typedef struct
{
//定义三元组表
int m;
int n;
int t;
TripleNode data[MaxSize]; //矩阵行,列及三元组表长度
} Tripletable;
//输入矩阵三元组并且存储
void CreatMat(Tripletable *temp,ElemType A[M][N])
{
int i, j,r,c;
cout<<"Please enter the value of Row and Col"<<endl;
cin>>r>>c;
temp->m=r;
temp->n=c;
temp->t=0;
for(i=0;i<r;i++)
{
for (j=0;j<c;j++)
{
cin>>A[i][j];
if (A[i][j] != 0 ) /*只存储非零元素*/
{
temp->data[temp->t].i=i;
temp->data[temp->t].j=j;
temp->data[temp->t].value=A[i][j];
temp->t++;
}
}
}
}
//矩阵相加算法
void AddTriTuple(Tripletable *A,Tripletable *B,Tripletable *C)
{
//三元组表表示的稀疏矩阵A,B相加
int k,l;
ElemType temp;
C->m=A->m;//矩阵行数
C->n=A->n;//矩阵列数
C->t=0; //三元组表长度
k=0;
l=0;
while(k<A->t&&l<B->t)
{
if((A->data[k].i==B->data[l].i)&&(A->data[k].j==B->data[l].j))
{
temp=A->data[k].value+B->data[l].value;
if(!temp)//相加不为零,加入C
{
C->data[C->t].i=A->data[k].i;
C->data[C->t].j=A->data[k].j;
C->data[C->t++].value=temp;
}
k++;
l++;
}
if (((A->data[k].i==B->data[l].i)&&(A->data[k].j<B->data[l].j))
|| (A->data[k].i<B->data[l].i))//将A中三元组加入C
{
C->data[C->t].i=A->data[k].i;
C->data[C->t].j=A->data[k].j;
C->data[C->t++].value=A->data[k].value;
k++;
}
if( ((A->data[k].i==B->data[l].i)&&(A->data[k].j>B->data[l].j))
||(A->data[k].i>B->data[l].i))//将B中三元组加入C
{
C->data[C->t].i=B->data[l].i;
C->data[C->t].j=B->data[l].j;
C->data[C->t++].value=B->data[l].value;
l++;
}
}
while (k<A->t)//将A中剩余三元组加入C
{
C->data[C->t].i=A->data[k].i;
C->data[C->t].j=A->data[k].j;
C->data[C->t++].value=A->data[k].value;
k++;
}
while(l<B->t)//将B中剩余三元组加入C
{
C->data[C->t].i=B->data[l].i;
C->data[C->t].j=B->data[l].j;
C->data[C->t++].value=B->data[l].value;
l++;
}
}
void ouputTripleTable(Tripletable *C)
{
int i,j;
int k=0;
for(i=0;i<C->m;i++)
{
for(j=0;j<C->n;j++)
{
if(i==C->data[k].i && j==C->data[k].j)
cout<<C->data[k++].value;
else
cout<<"0";
if(j<C->n-1)
cout<<" ";
else
cout<<endl;
}
}
}
int main()
{
int a[M][N];
int b[M][N];
Tripletable *A,*B,*C;
CreatMat(A,a);
CreatMat(B,b);
AddTriTuple(A,B,C);
ouputTripleTable(C);
}
输入第二个三元组数据这里有点问题using namespace std;
#define MaxSize 100 //用户自定义
#define M 100
#define N 100
typedef int ElemType; //用户自定义
typedef struct
{
//定义三元组
int i;
int j;
ElemType value;
} TripleNode;
typedef struct
{
//定义三元组表
int m;
int n;
int t;
TripleNode data[MaxSize]; //矩阵行,列及三元组表长度
} Tripletable;
//输入矩阵三元组并且存储
void CreatMat(Tripletable *temp,ElemType A[M][N])
{
int i, j,r,c;
cout<<"Please enter the value of Row and Col"<<endl;
cin>>r>>c;
temp->m=r;
temp->n=c;
temp->t=0;
for(i=0;i<r;i++)
{
for (j=0;j<c;j++)
{
cin>>A[i][j];
if (A[i][j] != 0 ) /*只存储非零元素*/
{
temp->data[temp->t].i=i;
temp->data[temp->t].j=j;
temp->data[temp->t].value=A[i][j];
temp->t++;
}
}
}
}
//矩阵相加算法
void AddTriTuple(Tripletable *A,Tripletable *B,Tripletable *C)
{
//三元组表表示的稀疏矩阵A,B相加
int k,l;
ElemType temp;
C->m=A->m;//矩阵行数
C->n=A->n;//矩阵列数
C->t=0; //三元组表长度
k=0;
l=0;
while(k<A->t&&l<B->t)
{
if((A->data[k].i==B->data[l].i)&&(A->data[k].j==B->data[l].j))
{
temp=A->data[k].value+B->data[l].value;
if(!temp)//相加不为零,加入C
{
C->data[C->t].i=A->data[k].i;
C->data[C->t].j=A->data[k].j;
C->data[C->t++].value=temp;
}
k++;
l++;
}
if (((A->data[k].i==B->data[l].i)&&(A->data[k].j<B->data[l].j))
|| (A->data[k].i<B->data[l].i))//将A中三元组加入C
{
C->data[C->t].i=A->data[k].i;
C->data[C->t].j=A->data[k].j;
C->data[C->t++].value=A->data[k].value;
k++;
}
if( ((A->data[k].i==B->data[l].i)&&(A->data[k].j>B->data[l].j))
||(A->data[k].i>B->data[l].i))//将B中三元组加入C
{
C->data[C->t].i=B->data[l].i;
C->data[C->t].j=B->data[l].j;
C->data[C->t++].value=B->data[l].value;
l++;
}
}
while (k<A->t)//将A中剩余三元组加入C
{
C->data[C->t].i=A->data[k].i;
C->data[C->t].j=A->data[k].j;
C->data[C->t++].value=A->data[k].value;
k++;
}
while(l<B->t)//将B中剩余三元组加入C
{
C->data[C->t].i=B->data[l].i;
C->data[C->t].j=B->data[l].j;
C->data[C->t++].value=B->data[l].value;
l++;
}
}
void ouputTripleTable(Tripletable *C)
{
int i,j;
int k=0;
for(i=0;i<C->m;i++)
{
for(j=0;j<C->n;j++)
{
if(i==C->data[k].i && j==C->data[k].j)
cout<<C->data[k++].value;
else
cout<<"0";
if(j<C->n-1)
cout<<" ";
else
cout<<endl;
}
}
}
int main()
{
int a[M][N];
int b[M][N];
Tripletable *A,*B,*C;
CreatMat(A,a);
CreatMat(B,b);
AddTriTuple(A,B,C);
ouputTripleTable(C);
}
[ 本帖最后由 liucs116 于 2010-11-27 15:20 编辑 ]