⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 text5.c

📁 这是C语言代码
💻 C
字号:

#include "stdio.h"
#include "stdlib.h"
#define   MAXSIZE   20
#define   MAXRC   50
#define   error 0
typedef   struct{int i,j;
          int e;} Triple ; 
typedef   struct{
  Triple   data[MAXSIZE+1];
  int     rpos[MAXRC+1];
  int     mu,nu,tu;
} RLSMatrix ; 

void ADD(RLSMatrix *A,RLSMatrix *B,RLSMatrix *Q)
{     void PRINTF(RLSMatrix *Q);
    int x=1;
    int y=1;
    int z=1;     
    Q->tu=0; 
    Q->mu=A->mu;
    Q->nu=A->nu;     
    while(x<=A->tu){if(A->data[x].i<B->data[y].i){
          Q->data[z].i=A->data[x].i;
          Q->data[z].j=A->data[x].j;
          Q->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){
          Q->data[z].i=B->data[y].i;
          Q->data[z].j=B->data[y].j;
          Q->data[z].e=B->data[y].e;   
          y++;z++;}
        else if(A->data[x].j==B->data[y].j){
        if((Q->data[z].e=A->data[x].e+B->data[y].e)!=0)
  {Q->data[z].i=A->data[x].i;
      Q->data[z].j=A->data[x].j;
  x++;
  y++;
  z++;}
  else
  {x++;
  y++;}}
        else if(A->data[x].j<B->data[y].j){
          Q->data[z].i=A->data[x].i;
          Q->data[z].j=A->data[x].j;
          Q->data[z].e=A->data[x].e;
          x++;z++;}}
        else if(A->data[x].i>B->data[y].i){
          Q->data[z].i=B->data[y].i;
          Q->data[z].j=B->data[y].j;
          Q->data[z].e=B->data[y].e;   
          y++;z++;}
    if(y>=B->tu)
      break;}//while
    if(x<=A->tu){
        while(x<=A->tu){
          Q->data[z].i=A->data[x].i;
          Q->data[z].j=A->data[x].j;
          Q->data[z].e=A->data[x].e;
          x++;z++; }}
    if(y<=B->tu){while(y<=B->tu){ 
            Q->data[z].i=B->data[y].i;
            Q->data[z].j=B->data[y].j;
            Q->data[z].e=B->data[y].e;
            y++;z++;}}
  
Q->tu=z;   
PRINTF(A);
PRINTF(B);
PRINTF(Q);}

void SUB(RLSMatrix *A,RLSMatrix *B,RLSMatrix *Q)
{
  void PRINTF(RLSMatrix *Q);
  int x=1;
  int y=1;
  int z=1;
  Q->tu=0;
  Q->mu=A->mu;
  Q->nu=A->nu;

  while(x<=A->tu){if(A->data[x].i<B->data[y].i){
          Q->data[z].i=A->data[x].i;
          Q->data[z].j=A->data[x].j;
          Q->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)
        { Q->data[z].i=B->data[y].i;
          Q->data[z].j=B->data[y].j;
          Q->data[z].e=0-B->data[y].e;   
          y++;z++;}
        else if(A->data[x].j==B->data[y].j){
          if((Q->data[z].e=A->data[x].e-B->data[y].e)!=0)
  {Q->data[z].i=A->data[x].i;
  Q->data[z].j=A->data[x].j;
  x++;
  y++;
  z++;}
  else
  {x++;
  y++;}
  }
  else if(A->data[x].j<B->data[y].j)
    { Q->data[z].i=A->data[x].i;
      Q->data[z].j=A->data[x].j;
      Q->data[z].e=A->data[x].e;
      x++;z++;}
      }

      else if(A->data[x].i>B->data[y].i)
      {     Q->data[z].i=B->data[y].i;
          Q->data[z].j=B->data[y].j;
          Q->data[z].e=0-B->data[y].e;   
          y++;z++;}
    if(y>=B->tu)
    break;
    }//while     
    if(x<=A->tu){
        while(x<=A->tu){
          Q->data[z].i=A->data[x].i;
          Q->data[z].j=A->data[x].j;
          Q->data[z].e=A->data[x].e;
          x++;z++;}
    }
    if(y<=B->tu){
        while(y<=B->tu){ 
          Q->data[z].i=B->data[y].i;
          Q->data[z].j=B->data[y].j;
          Q->data[z].e=0-B->data[y].e;
          y++;z++; }
    }   
Q->tu=z; 
PRINTF(A);
PRINTF(B);
PRINTF(Q);}

void MUL(RLSMatrix *A,RLSMatrix *B,RLSMatrix *Q)
{   void PRINTF(RLSMatrix *Q);   
  int ctemp[MAXRC];
  int tp,p,t,arow,brow,q,ccol,i;   
  Q->mu=A->mu;
  Q->nu=B->nu;
  Q->tu=0;
  if(A->tu*B->tu!=0){
    for(arow=1;arow<=A->mu;++arow)
    { 
        for(i=1;i<=Q->nu;i++)
        ctemp==0;         
        Q->rpos[arow]=Q->tu+1;
        if(arow<A->mu)
          tp=A->rpos[arow+1];
        else
          tp=A->tu+1;
        for(p=A->rpos[arow];p<tp;++p){
          brow=A->data[p].j;
          if(brow<B->mu)
            t=B->rpos[brow+1];
          else
            t=B->tu+1;
          for(q=B->rpos[brow];q<t;++q){
            ccol=B->data[q].j;
            ctemp[ccol]+=A->data[p].e*B->data[q].e;}
        }
        for(ccol=1;ccol<=Q->nu;++ccol)
        {if(ctemp[ccol])
{if(++Q->tu<=MAXSIZE)
  {Q->data[Q->tu].i=arow;
    Q->data[Q->tu].j=ccol;
    Q->data[Q->tu].e=ctemp[ccol];}
        }
      }
  }
}

PRINTF(A);
PRINTF(B);
PRINTF(Q);}


void PRINTF( RLSMatrix *A)
{
int arow,i=1,col;
int z=0;
for(arow=1;arow<=A->mu;arow++)
  {   printf("\n");
for(col=1;col<=A->nu;col++)
  {   if(arow==A->data.i&&col==A->data.j&&i<=A->tu)
        printf("%-4d",A->data[i++].e);
  else printf("%-4d",z);}
}
printf("\n");}
    
void main()
{   void ADD(RLSMatrix *A,RLSMatrix *B,RLSMatrix *Q);
  void SUB(RLSMatrix *A,RLSMatrix *B,RLSMatrix *Q);
  void MUL(RLSMatrix *A,RLSMatrix *B,RLSMatrix *Q); 
  int k,c,num[MAXRC];
char cmd;
  RLSMatrix *A,*B,*Q;   
  A=( RLSMatrix *)malloc(sizeof( RLSMatrix));
  B=( RLSMatrix *)malloc(sizeof( RLSMatrix));
  Q=( RLSMatrix *)malloc(sizeof( RLSMatrix));
do{
printf("请输入矩阵A的行数列数和非零元个数:");
  scanf("%d %d %d",&A->mu,&A->nu,&A->tu);
  printf("请输入矩阵A的非零元:");
  for(k=1;k<=A->tu;k++)
    scanf("%d %d %d",&A->data[k].i,&A->data[k].j,&A->data[k].e);
  for(k=1;k<=A->mu;k++)
num[k]=0;
for(k=1;k<=A->tu;k++)
++num[A->data[k].i];
A->rpos[1]=1;
for(k=2;k<=A->mu;k++)
A->rpos[k]=A->rpos[k-1]+num[k-1]; 
  printf("请输入矩阵B的行数列数和非零元个数:");
  scanf("%d %d %d",&B->mu,&B->nu,&B->tu);
  printf("请输入矩阵B的非零元:");
  for(k=1;k<=B->tu;k++)
    scanf("%d %d %d",&B->data[k].i,&B->data[k].j,&B->data[k].e);

  for(k=1;k<=B->mu;k++)
num[k]=0;
for(k=1;k<=B->tu;k++)
++num[B->data[k].i];
B->rpos[1]=1;
for(k=2;k<=B->mu;k++)
B->rpos[k]=B->rpos[k-1]+num[k-1]; 
  getchar();
  printf("请输入要进行的操作:");
  c=getchar();
  if(c=='+')
  {
    if(A->mu==B->mu&&A->nu==B->nu)
      ADD(A,B,Q);}
  else if(c=='-')
  {
    if(A->mu==B->mu&&A->nu==B->nu)
      SUB(A,B,Q);}
  else if(c=='*')
  {
    if(A->nu==B->mu)
      MUL(A,B,Q);}
  else
    printf("error operation!");
  printf(" Y或y继续");
  scanf("%s",&cmd);
  }while(cmd=='Y'||cmd=='y');
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -