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

📄 jiuzhen.cpp

📁 数据结构课程设计
💻 CPP
字号:
#include<iostream.h>
#include<stdio.h>

#define  MAXSIZE 400 //元素个数的最大值为400

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

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

void CreateTSMatrix(TSMatrix &M,int m,int n,int k) //根据行数、列数和非零元个数建立三元组
{
	int i;
    M.mu=m;
    M.nu=n;
    M.tu=k;
 for(i=1;i<=k;i++)   //根据非零个数的多少,循环输入三元组
 {
	printf("               第%d个非零元(行 列 值): ",i);
    scanf("%d %d %d",&M.data[i].i,&M.data[i].j,&M.data[i].e);
 }
}

int input(TSMatrix &M,TSMatrix &T)//矩阵输入函数,根据行数、列数和非零元个数循环输入到三元组中
{
    int m1,m2,n1,n2,k1,k2;
    printf("请输入第一个距阵的行数、列数和非零元个数: ");
    scanf("%d %d %d",&m1,&n1,&k1);
   if(m1<1||n1<1||k1<0)
    {
     printf("输入有误!请重新输入…\n");return 0;}
     printf("第一个距阵信息:\n");
     CreateTSMatrix(M,m1,n1,k1);
     printf("请输入第二个距阵的行数、列数和非零元个数: ");
     scanf("%d %d %d",&m2,&n2,&k2);
   if(m2<1||n2<1||k2<0)
	 {printf("输入有误!请重新输入…\n");return 0;}
     printf("第二个距阵信息:\n");
     CreateTSMatrix(T,m2,n2,k2);
     return 1;
}
void print(TSMatrix &Y)  //矩阵输出函数,输出矩阵形式
{
    int i,j,p=1;
    for(i=1;i<=Y.mu;i++)
    {
        for(j=1;j<=Y.nu;j++)
        {
            if(i==Y.data[p].i && j==Y.data[p].j) //如果此元存在,即直接输出
            {printf("%5d",Y.data[p].e);p++;}
            else  printf("%5d",0);//不存在则输出零
        }
        cout<<endl; //矩阵换行
    }
}
void AddTSMatrix(TSMatrix &M,TSMatrix &T,TSMatrix &Y)  //矩阵加法运算,Y=M+T
{
    Y.mu=M.mu;     //定义相加结果的行、列个数
    Y.nu=M.nu;
    for(int i=1;i<=M.tu;i++)  //把矩阵M复制到结果Y
        {
		 Y.data[i].i=M.data[i].i;
         Y.data[i].j=M.data[i].j;
         Y.data[i].e=M.data[i].e;
        }
    int m=0,k=M.tu;
    for(i=1;i<=T.tu;i++)     //读取矩阵T的元素
      {
		for(int j=1;j<=M.tu;j++)
		 if(T.data[i].i==Y.data[j].i && T.data[i].j==Y.data[j].j)  //如果元素的行数和列数相同,则把两结果相加
		  { Y.data[j].e=Y.data[j].e+T.data[i].e; m=1;}
        if(m==0)    //如果元素的行数和列数不同,则把它添加进矩阵Y
        {
		  ++k;
          Y.data[k].i=T.data[i].i;
          Y.data[k].j=T.data[i].j;
          Y.data[k].e=T.data[i].e;
		}
		else m=0;
      }
    Y.tu=k;
}
void SubTSMatrix(TSMatrix &M,TSMatrix &T,TSMatrix &Y)  //矩阵减法运算,Y=M-T
{
    Y.mu=M.mu;
    Y.nu=M.nu;
    for(int i=1;i<=M.tu;i++)
        {Y.data[i].i=M.data[i].i;
         Y.data[i].j=M.data[i].j;
         Y.data[i].e=M.data[i].e;}
    int m=0,k=M.tu;
    for(int s=1;s<=T.tu;s++)
        {for(int t=1;t<=M.tu;t++)
            if(T.data[s].i==Y.data[t].i && T.data[s].j==Y.data[t].j)
	         {Y.data[t].e=Y.data[t].e-T.data[s].e;m=1;}
         if(m==0)
           {++k;
            Y.data[k].i=T.data[s].i;
            Y.data[k].j=T.data[s].j;
		    Y.data[k].e=-T.data[s].e;}
         else m=0;
	}    Y.tu=k;
}
void MUlTSMatrix(TSMatrix &M,TSMatrix &T,TSMatrix &Y) //矩阵乘法运算,Y=M*T
{
    int i,k=1,flag=0;
    Y.mu=M.mu;
    Y.nu=T.nu;
    Y.tu=0;      //Y的初始非零元为零
    for(i=1;i<=M.tu;i++)  //逐个读取矩阵M中非零元
        {for(int j=1;j<=T.tu;j++)  //逐个读取矩阵T中的非零元
           {if(M.data[i].j==T.data[j].i ) //如果M中第i个元素的列与T中第j个元素的行相等
             {for(int m=1;m<=k;m++)   //检查Y中是否存在第i行第j列的元素
               {if(Y.data[m].i==M.data[i].i && Y.data[m].j==T.data[j].j)//如果存在,则把M与T的元素相乘后加到这个元素上
                 {Y.data[m].e=Y.data[m].e+M.data[i].e*T.data[j].e;
                  flag=1;//此时判参数flag=1;
                 }
               }
              if(flag==0) //如果Y中不存在此元,则把结果添加到Y中,此时Y中的非零元加1
              {
               Y.data[k].e=M.data[i].e*T.data[j].e;
               Y.data[k].i=M.data[i].i;
               Y.data[k].j=T.data[j].j;
               k++;
              }
              flag=0;
             }
           }
        }
    Y.tu=k-1;  //因为初值是K=1,所以现在减1才是真正Y的非零元个数
}
void main()  //主函数
{
    TSMatrix M;   //定义三个三元组结构,用于存放矩阵。
    TSMatrix T;
    TSMatrix Y;
    char choice;
    cout<<"                      稀疏矩阵运算器 "<<endl<<endl;
    do{
      printf("运算选择:\n" );
      printf("          矩阵加法<A> 矩阵减法<S> 矩阵乘法<M> 退出系统<Q>\n");
      printf("请选择:\n");
	  
      scanf("%c",&choice);
	  if (choice==10)scanf("%c",&choice);
      switch(choice)  //各菜单项
        {
            case'A':{ //矩阵加法
                     input(M,T);
                     if(M.mu!=T.mu && M.nu!=T.nu)
                       {printf("两个矩阵的行、列数不匹配,请重新输入…\n");break;}
                     else
                       {
                        AddTSMatrix(M,T,Y);
                        cout<<"第一个要加的矩阵是:" <<endl;
                        print(M);
                        cout<<"第二个要加的矩阵是:" <<endl;
                        print(T);
                        cout<<"相加结果矩阵是:" <<endl;
                        print(Y);}
                    }break;
            case'S':{ //矩阵减法
                     input(M,T);
                     if(M.mu!=T.mu && M.nu!=T.nu)
                       {printf("两个矩阵的行、列数不匹配,请重新输入…\n"); break;}
                     else
                       {SubTSMatrix(M,T,Y);
                        cout<<"被减矩阵是:"<<endl;
                        print(M);
                        cout<<"要减矩阵是:"<<endl;
                        print(T);
                        cout<<"相减结果矩阵是:"<<endl;
                        print(Y);}
                        }break;
            case'M':{ //矩阵乘法
                     input(M,T);
                     if(M.nu!=T.mu)
                       {cout<<"两个矩阵的行、列数不匹配,请重新输入…\n"<<endl; break;}
                     else
                       {MUlTSMatrix(M,T,Y);
                        cout<<"第一个要乘的矩阵是:" <<endl;
                        print(M);
                        cout<<"第二个要乘的矩阵是:" <<endl;
                        print(T);
                        cout<<"相乘结果矩阵是:" <<endl;
                        print(Y);}
                      }break;
             case 'Q': //退出系统
		              break;
             default: cout<<"输入有误,请重新选择!\n";break;
        }/*switch*/
      }while(choice!='Q');
}


⌨️ 快捷键说明

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