内容
假设两个稀疏矩阵A和B,他们均为m行n列,要求表写求矩阵的加法即:C=A+B的算法(C矩阵存储A与B相加的结果)
分析
利用一维数组来存储,一维数组顺序存放非零元素的行号、列号和数值,行号-1表示结束,然后进行矩阵加法运算时依次扫描矩阵A和B的行列值,并以行优先。当行列相同的时候,将第三个元素的值相加和以及行列号三个元素存入结果数组C中;不相同时,将A或B的三个元素直接存入结果数组中。
代码
// fanchen.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
#define LINE 10
struct Node{
//行号
int row;
//列号
int line;
//数据
int data;
};
//初始化数组
int init(Node array[])
{
int row,line,data;
int index = 0;
while(cin>>row){
if(row == -1){
break;
}
cin>>line>>data;
array[index].data=data;
array[index].line = line;
array[index].row = row;
index++;
}
return index;
}
//打印数组
void printArray(Node array[],int len)
{
for(int i = 0;i < len;i++){
cout<<array[i].row<<" "<<array[i].line<<" "<<array[i].data<<endl;
}
}
int calc(Node a[],int lena,Node b[],int lenb,Node c[])
{
//计数单位
int index = 0;
int i = 0,j = 0,k;
while(i < lena && j < lenb){
int tempa = a[i].row * 10 + a[i].line;
int tempb = b[j].row * 10 + b[j].line;
if(tempa < tempb){
c[index++] = a[i++];
}else if(tempa == tempb){
int l = a[i].line;
int r = a[i].row;
int data = a[i].data + b[j].data;
c[index].line = l;
c[index].row = r;
c[index].data = data;
index++;
i++;
j++;
}else{
c[index++] = b[j++];
}
}
while(i < lena){
c[index++] = a[i++];
}
while(j < lenb){
c[index++] = b[j++];
}
return index;
}
int _tmain(int argc, _TCHAR* argv[])
{
Node a[60],b[60],c[60];
//a的长度
int lena = init(a);
int lenb = init(b);
int lenc = calc(a,lena,b,lenb,c);
cout<<"a::::"<<endl;
printArray(a,lena);
cout<<endl;
cout<<"b::::"<<endl;
printArray(b,lenb);
cout<<endl;
printArray(c,lenc);
system("pause");
return 0;
}