C语言数据结构——矩阵的加减乘除

#include<stdio.h>
//#include<iostream.h>
#include<stdlib.h>
#include<conio.h>
#include<malloc.h>
#define MAXSIZE 100   /*假设非零元个数的最大值为100*/

typedef struct
{int i,j;           /*该非零元的行下标和列下标*/
 int v;
}Triple;

typedef struct
{Triple data[MAXSIZE+1];         /*非零元三元组表,data[0]未用*/
 int mu,nu,tu;                   /*矩阵的行数,列数和非零元个数*/
}TSMastrix;

//********************** 声明函数 **********************//

void creat(TSMastrix &T);/*创建三元组*/
void add(TSMastrix A,TSMastrix B);/*加法运算*/
void sub(TSMastrix A,TSMastrix B);/*减法运算*/
void mult(TSMastrix A,TSMastrix B);/* 乘法运算*/
void print(TSMastrix A);/*输出计算结果*/
char menu();//菜单
void display (TSMastrix M);//s输出函数

//******************** 主函数 ***********************//
int main()
{ 
         TSMastrix A,B; 
         creat(A);
         creat(B);
            printf("***************   创 建 矩 阵      ********************\n");

        for(;;)
        switch(menu())
  {
      case '0':
            printf("*****************输 出 矩 阵 A*************************\n");
            display(A);
            printf("*****************输 出 矩 阵 B*************************\n");
            display(B);
            getchar();
              break;
      case '1': 
            add(A,B);
            getch();
            break;
      case '2': 
             sub(A,B);
             getch();
             break;
      case '3':  
               mult(A,B);
               getch();
               break;
      case '4':
                creat(A);
                creat(B);
                getch();
                break;
      case '5':
                system("cls");
                exit(0);
  }
}

//********************* 子 函 数 ****** *****************//

//******** 创建三元组存储矩阵数据 ********//

void creat(TSMastrix &T)
{ 
    int k,i,j;
  printf("\n 请输入矩阵\n");
  do
  {
      printf("\n请输入矩阵的行数,列数,非零元素个数\n");
      scanf("%d %d %d",&T.mu,&T.nu,&T.tu);
       if((T.mu<0||T.mu>20)||(T.nu<0||T.nu>20)||((T.tu>T.mu*T.nu)||T.tu>MAXSIZE))
        printf("\n 超出行列定义范围,请重新输入!!\n");
      }
  while((T.mu<0||T.mu>20)||(T.nu<0||T.nu>20)||((T.tu>T.mu*T.nu)||T.tu>MAXSIZE));
  printf("*********************************************************\n");
  for(k=1;k<=T.tu;k++)
{
  do
  {
      printf("\n请输入非零元素的行数i,列数j,数值v\n");
      scanf("%d,%d,%d",&T.data[k].i,&T.data[k].j,&T.data[k].v);
      if((T.data[k].i<0||T.data[k].i>T.mu)||(T.data[k].j<0||T.data[k].j>T.nu)||(T.data[k].v==0))
      printf("\n 超出行列定义范围,请重新输入!\n");
  } 
  while((T.data[k].i<0||T.data[k].i>T.mu)||(T.data[k].j<0||T.data[k].j>T.nu)||(T.data[k].v==0));
  printf("*********************************************************\n");
}
 return;
}

//********* 输出矩阵函数 ********//

void display( TSMastrix M)
{
    int q,n,k,a=0;
    printf("------------------------------------------------------------\n");
    printf("------------------------------------------------------------\n");
    for(n=1;n<=M.mu;n++)
    {
       for(k=1;k<=M.nu;k++)
        {
            for(q=1;q<=M.tu;q++)
            {
                if(M.data[q].i==n&&M.data[q].j==k)
                {
                    printf("\t%-3d",M.data[q].v);
                    break;
                }
            }
            if(q>M.tu)printf("\t%-3d",a);

        }
        printf("\n");

    } 

    printf("------------------------------------------------------------\n");
    printf("------------------------------------------------------------\n");   
    printf("\n");
}

//******** 加法运算 **********//
void add(TSMastrix A,TSMastrix B)               
{
 int n,k;
 if(A.mu!=B.mu||A.nu!=B.nu)
 { printf("\n    不满足两个矩阵相加条件!"); 
     printf("\n 需要满足两矩阵的行数、列数均各自相等方可经行减法运算!!");
 }
  else  {for(n=1;n<=A.tu;n++)
          for(k=1;k<=B.tu;k++)                 /*将矩阵T的非零元接至M中*/
     {if(A.data[n].i==B.data[k].i&&A.data[n].j==B.data[k].j)
                       {A.data[n].v+=B.data[k].v;
                        B.data[k].v=0;}
        }
            for(k=1;k<=B.tu;k++)
    if(B.data[k].v!=0)
    {A.data[A.tu+1].i=B.data[k].i;
     A.data[A.tu+1].j=B.data[k].j;
     A.data[A.tu+1].v=B.data[k].v;
     A.tu++;   
    }
  print(A);
     }
}
//******* 减法运算 *********//

void sub(TSMastrix A,TSMastrix B)              
{int n,k;
 if(A.mu!=B.mu||A.nu!=B.nu)
 { printf("\n 不满足两个矩阵相减条件!"); 
     printf("\n 需要满足两矩阵的行数、列数均各自相等方可经行减法运算!!");
 }
  else{
     for(n=1;n<=A.tu;n++)
         for(k=1;k<=B.tu;k++)                  /*将矩阵T的非零元接至M中*/
    {
    if(A.data[n].i==B.data[k].i&&A.data[n].j==B.data[k].j)
                       {A.data[n].v-=B.data[k].v;
                        B.data[k].v=0;}
    }
            for(k=1;k<=B.tu;k++)
    if(B.data[k].v!=0)
    {A.data[A.tu+1].i=B.data[k].i;
     A.data[A.tu+1].j=B.data[k].j;
     A.data[A.tu+1].v=-B.data[k].v;
     A.tu++;}
            print(A); 
  }  
}

 //****** 乘法运算 *******// 

void mult(TSMastrix A,TSMastrix B)               
{int z,n1,k1,n2,k2,s,sum,count=0;
 TSMastrix Z;
 int b1[100][100],b2[100][100],b3[100][100];
 if(A.nu!=B.mu)printf("矩阵的行数与列数不像等,不能进行相乘运算!");
 else{
   Z.mu=A.mu;
      Z.nu=B.nu;
   for(n1=1;n1<=A.mu;n1++)                        /*初始化为零*/
    for(k1=1;k1<=A.nu;k1++){b1[n1][k1]=0;}
      for(n1=1;n1<=A.mu;n1++)
    for(k1=1;k1<=A.nu;k1++){b2[n1][k1]=0;}
      for(n1=1;n1<=A.tu;n1++)                     /*装载三元组数据*/
   {b1[A.data[n1].i][A.data[n1].j]=A.data[n1].v;}
   for(n1=1;n1<=B.tu;n1++)
   {b2[B.data[n1].i][B.data[n1].j]=B.data[n1].v;}

   for(n1=1;n1<=Z.mu;n1++)
   { for(k2=1;k2<=Z.nu;k2++)
        {
      sum=0;
         for(k1=1;k1<=Z.nu;k1++)
   {
    sum+=b1[n1][k1]*b2[k1][k2];
   }
   if(sum!=0)
     {count++;
      Z.data[count].i=n1;
               Z.data[count].j=k2;
            Z.data[count].v=sum;
               Z.tu=count;
              }
        }                 
     }
    print(Z);
 }
}
//****** 输出计算结果 ********//

void print(TSMastrix A)                             
{int q,n,k,a=0;
system("cls");
 printf("\n\n经过稀疏矩阵运算器运算,所得结果为:\n");
printf("------------------------------------------------------------\n");
printf("------------------------------------------------------------\n");
 for(n=1;n<=A.mu;n++)
 {
  for(k=1;k<=A.nu;k++)
       {
   for(q=1;q<=A.tu;q++)
   {if(A.data[q].i==n&&A.data[q].j==k){printf("\t%-3d",A.data[q].v);break;}
      }
   if(q>A.tu)printf("\t%-3d",a);   
    }
  printf("\n");
 } 
 printf("------------------------------------------------------------\n");
 printf("------------------------------------------------------------\n");
 }
//*********** 菜单 *********//

char menu()                                          
{
 char n;
 printf("                                                                                \n");
 printf("                 稀疏矩阵运算器                                     \n");
 printf("******************************************************************\n");
 printf("*                0: 输出矩阵                                      *\n");
 printf("*                1:两个矩阵相加                                    *\n");
 printf("*                2:两个矩阵相減                                    *\n");
 printf("*                3:两个矩阵相乘                                    *\n");
 printf("*                4:重新创建矩阵                                    *\n");
 printf("*                5:成功安全退出                                    *\n");
printf("********************************************************************************\n");
 printf("\n\n\n                        请选择你需要的操作: ");
 n=getchar();
 return n;
}
  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值