稀疏矩阵运算器-数据结构课程设计
/*******************************稀疏矩阵运算器*************************************/
#include "stdio.h"
#include "stdlib.h"
#define MAXSIZE 20 /*非零元个数*/
#define MAXRC 20
#define MAXR 20
#define MAXC 20
typedef struct{
int i,j; /*非零元行下标和列下标*/
int e;
} Triple ;
typedef struct{
Triple data[MAXSIZE+1]; /*非零元三元组,data[0]未用*/
int rpos[MAXRC+1]; /*各行第一非零元的位置表*/
int mu,nu,tu; /*矩阵的行数,列数,非零元数*/
} RLSMatrix ;
#include "stdio.h"
#include "stdlib.h"
#define MAXSIZE 20 /*非零元个数*/
#define MAXRC 20
#define MAXR 20
#define MAXC 20
typedef struct{
int i,j; /*非零元行下标和列下标*/
int e;
} Triple ;
typedef struct{
Triple data[MAXSIZE+1]; /*非零元三元组,data[0]未用*/
int rpos[MAXRC+1]; /*各行第一非零元的位置表*/
int mu,nu,tu; /*矩阵的行数,列数,非零元数*/
} RLSMatrix ;
void Print(RLSMatrix *A,RLSMatrix *B,RLSMatrix *T);
void ADD(RLSMatrix *A,RLSMatrix *B,RLSMatrix *T) /*加法*/
{
int x=1;
int y=1;
int z=1;
T->tu=0;
T->mu=A->mu;
T->nu=A->nu;
while(x<=A->tu)
{
if(A->data[x].i<B->data[y].i)
{
T->data[z].i=A->data[x].i;
T->data[z].j=A->data[x].j;
T->data[z].e=A->data[x].e;
x++;z++;
}
else if(A->data[x].i==B->data[y].i)
{
if(A->data[x].j>B->data[y].j)
{
T->data[z].i=B->data[y].i;
T->data[z].j=B->data[y].j;
T->data[z].e=B->data[y].e;
y++;z++;
}
else if(A->data[x].j==B->data[y].j){
if((T->data[z].e=A->data[x].e+B->data[y].e)!=0)
{
T->data[z].i=A->data[x].i;
T->data[z].j=A->data[x].j;
x++;
y++;
z++;
}
else
{
x++;
y++;
}
}
else if(A->data[x].j<B->data[y].j)
{
T->data[z].i=A->data[x].i;
T->data[z].j=A->data[x].j;
T->data[z].e=A->data[x].e;
x++;z++;
}
}
else if(A->data[x].i>B->data[y].i)
{
T->data[z].i=B->data[y].i;
T->data[z].j=B->data[y].j;
T->data[z].e=B->data[y].e;
y++;z++;
}
if(y>=B->tu)
break;
}
if(x<=A->tu){
while(x<=A->tu){
T->data[z].i=A->data[x].i;
T->data[z].j=A->data[x].j;
T->data[z].e=A->data[x].e;
x++;z++;
}
}
if(y<=B->tu){
while(y<=B->tu){
T->data[z].i=B->data[y].i;
T->data[z].j=B->data[y].j;
T->data[z].e=B->data[y].e;
y++;z++;
}
}
T->tu=z;
Print(A,B,T);
}
void ADD(RLSMatrix *A,RLSMatrix *B,RLSMatrix *T) /*加法*/
{
int x=1;
int y=1;
int z=1;
T->tu=0;
T->mu=A->mu;
T->nu=A->nu;
while(x<=A->tu)
{
if(A->data[x].i<B->data[y].i)
{
T->data[z].i=A->data[x].i;
T->data[z].j=A->data[x].j;
T->data[z].e=A->data[x].e;
x++;z++;
}
else if(A->data[x].i==B->data[y].i)
{
if(A->data[x].j>B->data[y].j)
{
T->data[z].i=B->data[y].i;
T->data[z].j=B->data[y].j;
T->data[z].e=B->data[y].e;
y++;z++;
}
else if(A->data[x].j==B->data[y].j){
if((T->data[z].e=A->data[x].e+B->data[y].e)!=0)
{
T->data[z].i=A->data[x].i;
T->data[z].j=A->data[x].j;
x++;
y++;
z++;
}
else
{
x++;
y++;
}
}
else if(A->data[x].j<B->data[y].j)
{
T->data[z].i=A->data[x].i;
T->data[z].j=A->data[x].j;
T->data[z].e=A->data[x].e;
x++;z++;
}
}
else if(A->data[x].i>B->data[y].i)
{
T->data[z].i=B->data[y].i;
T->data[z].j=B->data[y].j;
T->data[z].e=B->data[y].e;
y++;z++;
}
if(y>=B->tu)
break;
}
if(x<=A->tu){
while(x<=A->tu){
T->data[z].i=A->data[x].i;
T->data[z].j=A->data[x].j;
T->data[z].e=A->data[x].e;
x++;z++;
}
}
if(y<=B->tu){
while(y<=B->tu){
T->data[z].i=B->data[y].i;
T->data[z].j=B->data[y].j;
T->data[z].e=B->data[y].e;
y++;z++;
}
}
T->tu=z;
Print(A,B,T);
}
void SUB(RLSMatrix *A,RLSMatrix *B,RLSMatrix *T) /*减法*/
{
int x=1;
int y=1;
int z=1;
T->tu=0;
T->mu=A->mu;
T->nu=A->nu;
while(x<=A->tu)
{
if(A->data[x].i<B->data[y].i)
{
T->data[z].i=A->data[x].i;
T->data[z].j=A->data[x].j;
T->data[z].e=A->data[x].e;
x++;z++;
}
else if(A->data[x].i==B->data[y].i)
{
if(A->data[x].j>B->data[y].j)
{
T->data[z].i=B->data[y].i;
T->data[z].j=B->data[y].j;
T->data[z].e=0-B->data[y].e;
y++;z++;
}
else if(A->data[x].j==B->data[y].j){
if((T->data[z].e=A->data[x].e-B->data[y].e)!=0)
{
T->data[z].i=A->data[x].i;
T->data[z].j=A->data[x].j;
x++;
y++;
z++;
}
else
{
x++;
y++;
}
}
else if(A->data[x].j<B->data[y].j)
{
T->data[z].i=A->data[x].i;
T->data[z].j=A->data[x].j;
T->data[z].e=A->data[x].e;
x++;z++;
}
}
{
int x=1;
int y=1;
int z=1;
T->tu=0;
T->mu=A->mu;
T->nu=A->nu;
while(x<=A->tu)
{
if(A->data[x].i<B->data[y].i)
{
T->data[z].i=A->data[x].i;
T->data[z].j=A->data[x].j;
T->data[z].e=A->data[x].e;
x++;z++;
}
else if(A->data[x].i==B->data[y].i)
{
if(A->data[x].j>B->data[y].j)
{
T->data[z].i=B->data[y].i;
T->data[z].j=B->data[y].j;
T->data[z].e=0-B->data[y].e;
y++;z++;
}
else if(A->data[x].j==B->data[y].j){
if((T->data[z].e=A->data[x].e-B->data[y].e)!=0)
{
T->data[z].i=A->data[x].i;
T->data[z].j=A->data[x].j;
x++;
y++;
z++;
}
else
{
x++;
y++;
}
}
else if(A->data[x].j<B->data[y].j)
{
T->data[z].i=A->data[x].i;
T->data[z].j=A->data[x].j;
T->data[z].e=A->data[x].e;
x++;z++;
}
}
else if(A->data[x].i>B->data[y].i)
{
T->data[z].i=B->data[y].i;
T->data[z].j=B->data[y].j;
T->data[z].e=0-B->data[y].e;
y++;z++;
}
if(y>=B->tu)
break;
}
if(x<=A->tu)
{
while(x<=A->tu)
{
T->data[z].i=A->data[x].i;
T->data[z].j=A->data[x].j;
T->data[z].e=A->data[x].e;
x++;z++;
}
}
if(y<=B->tu)
{
while(y<=B->tu){
T->data[z].i=B->data[y].i;
T->data[z].j=B->data[y].j;
T->data[z].e=0-B->data[y].e;
y++;z++;
}
}
T->tu=z;
Print(A,B,T);
}
{
T->data[z].i=B->data[y].i;
T->data[z].j=B->data[y].j;
T->data[z].e=0-B->data[y].e;
y++;z++;
}
if(y>=B->tu)
break;
}
if(x<=A->tu)
{
while(x<=A->tu)
{
T->data[z].i=A->data[x].i;
T->data[z].j=A->data[x].j;
T->data[z].e=A->data[x].e;
x++;z++;
}
}
if(y<=B->tu)
{
while(y<=B->tu){
T->data[z].i=B->data[y].i;
T->data[z].j=B->data[y].j;
T->data[z].e=0-B->data[y].e;
y++;z++;
}
}
T->tu=z;
Print(A,B,T);
}