📄 smatrix.c
字号:
#include "smatrix.h"
#include <stdio.h>
#include <stdlib.h>
Status CreateRLSMatrix(RLSMatrix * sm)
{
int m=1,n=1,num=1;
sm->tu=0;
fflush(stdin);
printf("请输入矩阵的行数和列数:");
scanf("%d%d",&sm->mu,&sm->nu);
printf("请以按行优先的顺序输入矩阵的非零元i j e:\n");
scanf("%d %d %d",&sm->data[m].i,&sm->data[m].j,&sm->data[m].e);
while(sm->data[m].e){
if(m==1){
sm->rpos[n]=1;
n++;
}
else if(sm->data[m].i==sm->data[m-1].i) num++;
else {
sm->rpos[sm->data[m].i]=sm->rpos[n-1]+num;
for(;n<=sm->data[m].i;n++){
sm->rpos[n]=sm->rpos[sm->data[m].i];
num=1;
}
}
m++;
sm->tu++;
scanf("%d %d %d",&sm->data[m].i,&sm->data[m].j,&sm->data[m].e);
}
for(;n<=sm->mu;n++) sm->rpos[n]=sm->tu;
return OK;
}
Status AddRLSMatrix(RLSMatrix * sm_a,RLSMatrix * sm_b)
{
int n,a=1,b=1;
while(a<=sm_a->tu && b<=sm_b->tu){
if(sm_a->data[a].i<sm_b->data[b].i || (sm_a->data[a].i==sm_b->data[b].i && sm_a->data[a].j<sm_b->data[b].j)){
a++;
continue;
}
if(sm_a->data[a].i==sm_b->data[b].i && sm_a->data[a].j==sm_b->data[b].j){
sm_a->data[a].e+=sm_b->data[b].e;
b++;
if(sm_a->data[a].e==0){
for(n=a;n<sm_a->tu;n++)
sm_a->data[n]=sm_a->data[n+1];
sm_a->tu--;
}
else a++;
}
if(sm_a->data[a].i>sm_b->data[b].i || (sm_a->data[a].i==sm_b->data[b].i && sm_a->data[a].j>sm_b->data[b].j)){
for(n=sm_a->tu;n>=a;n--)
sm_a->data[n+1]=sm_a->data[n];
sm_a->data[a]=sm_b->data[b];
a++;
b++;
sm_a->tu++;
}
}
while(b<=sm_b->tu)
{
sm_a->data[a++]=sm_b->data[b++];
sm_a->tu++;
}
return OK;
}
Status SubRLSMatrix(RLSMatrix * sm_a,RLSMatrix * sm_b)
{
int n,a=1,b=1;
while(a<=sm_a->tu && b<=sm_b->tu){
if(sm_a->data[a].i<sm_b->data[b].i || (sm_a->data[a].i==sm_b->data[b].i && sm_a->data[a].j<sm_b->data[b].j)){
a++;
continue;
}
if(sm_a->data[a].i==sm_b->data[b].i && sm_a->data[a].j==sm_b->data[b].j){
sm_a->data[a].e-=sm_b->data[b].e;
b++;
if(!sm_a->data[a].e){
for(n=a;n<sm_a->tu;n++){
sm_a->data[n]=sm_a->data[n+1];
sm_a->tu--;
}
}
else a++;
}
if(sm_a->data[a].i>sm_b->data[b].i || (sm_a->data[a].i==sm_b->data[b].i && sm_a->data[a].j>sm_b->data[b].j)){
for(n=sm_a->tu;n>=a;n--)
sm_a->data[n+1]=sm_a->data[n];
sm_a->data[a]=sm_b->data[b];
a++;
b++;
sm_a->tu++;
}
}
while(b<=sm_b->tu){
sm_a->data[a]=sm_b->data[b];
sm_a->data[a].e=-sm_a->data[a].e;
a++;
b++;
sm_a->tu++;
}
return OK;
}
Status PrintRLSMatrix(RLSMatrix * sm)
{
int m,n,t=1;
for(m=1;m<=sm->mu;m++){
for(n=1;n<=sm->nu;n++){
if(m==sm->data[t].i && n==sm->data[t].j){
printf("%2d ",sm->data[t].e);
t++;
}
else printf(" 0 ");
}
printf("\n");
}
return OK;
}
Status MultRLSMatrix(RLSMatrix * sm_a,RLSMatrix * sm_b)
{
int i,j,a,b,sum,t;
int result[20][20]={0};
for(i=1;i<=sm_a->mu;i++){
for(j=1;j<=sm_b->nu;j++){
sum=0;
if(i<sm_a->mu) t=sm_a->rpos[i+1];
else t=sm_a->tu+1;
for(a=sm_a->rpos[i];a<=sm_a->tu && a<t;a++)
for(b=1;b<=sm_b->tu;b++)
if(sm_b->data[b].j==j && sm_a->data[a].j==sm_b->data[b].i)
sum+=sm_a->data[a].e*sm_b->data[b].e;
result[i][j]=sum;
}
if(a>sm_a->tu && j>sm_b->nu) break;
}
for(i=1;i<=sm_a->mu;i++){
for(j=1;j<=sm_b->nu;j++)
printf("%3d",result[i][j]);
printf("\n");
}
return OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -