0
点赞
收藏
分享

微信扫一扫

实验六 数组实验代码

月白色的大狒 2022-04-14 阅读 72

数组实验代码

#include <stdio.h>
#include <iostream>
 
#define ERROR -1
#define MAXSIZE 12500    //非零元个数最大值MAXSIZE
#define MAXRC 21         //各行第一个非零元位置最大值MAXRC
#define OK 1
 
typedef int ElemType;
typedef struct      
{
    int i,j;
    ElemType e;
} Triple;
 
typedef struct      
{
    Triple data[MAXSIZE+1];             //非零元三元组表
    int rpos[MAXRC+1];                  //各行第一个非零元的位置表
    int mu,nu,tu;                       //矩阵的行数、列数和非零元个数
} RLSMatrix;
 //创建 
void CreatSMatrix(RLSMatrix &M)             //建立以“带行链接信息”的三元组顺序表示的稀疏矩阵
{
    for(int i=1; i<=MAXRC+1; i++)
        M.rpos[i]=0;     //令所有的位置都为0
    printf("请输入矩阵的行数、列数和非零元个数(以空格隔开):");
    scanf("%d %d %d",&M.mu,&M.nu,&M.tu);

	for(int i=1; i<=M.tu; i++)
	{
	    printf("请用三元组形式输入矩阵的元素(行 列 非零元素):");
	    scanf("%d %d %d",&M.data[i].i,&M.data[i].j,&M.data[i].e);
	}
	for(int i=1,j=1; i<=M.mu; i++)     //求M.rpos[i]
	{
	    M.rpos[i]=j;
	    while(M.data[j].i==i && j<=M.tu)  j++;        //若某一行的元素多于1个时
	}
}
//相加 
bool AddSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix &Q)  //矩阵相加
{
    if(M.mu!=N.mu||M.nu!=N.nu)return ERROR;
    int i,j,k=1;
    Q.mu=M.mu;
    Q.nu=M.nu;
    for(i=1,j=1; i<=M.tu&&j<=N.tu;)
    {
        //按行优先,故分以下几种情况
        if(M.data[i].i==N.data[j].i)          //两元素同一行
        {
            if(M.data[i].j==N.data[j].j)         //两元素同一行且同一列(同位置)
            {
                Q.data[k].i=M.data[i].i;
                Q.data[k].j=M.data[i].j;
                Q.data[k].e=M.data[i].e+N.data[j].e;
                i++;
                j++;
                k++;
            }
            else if(M.data[i].j<N.data[j].j)    //两元素同一行,但M中的元素列数较小
            {
                Q.data[k].i=M.data[i].i;
                Q.data[k].j=M.data[i].j;
                Q.data[k].e=M.data[i].e;
                k++;
                i++;
            }
            else if(M.data[i].j>N.data[j].j)    //两元素同一行,但M中的元素列数较大
            {
                Q.data[k].i=N.data[j].i;
                Q.data[k].j=N.data[j].j;
                Q.data[k].e=N.data[j].e;
                k++;
                j++;
            }
        }
        else if(M.data[i].i<N.data[j].i)        //M中的元素行数较小
        {
            Q.data[k].i=M.data[i].i;
            Q.data[k].j=M.data[i].j;
            Q.data[k].e=M.data[i].e;
            k++;
            i++;
        }
        else if(M.data[i].i>N.data[j].i)        //M中的元素行数较大
        {
            Q.data[k].i=N.data[j].i;
            Q.data[k].j=N.data[j].j;
            Q.data[k].e=N.data[j].e;
            k++;
            j++;
        }
    }
    if(i!=M.tu+1)                             //计算最后的元素
        for(; i<=M.tu; i++)
        {
            Q.data[k].i=M.data[i].i;
            Q.data[k].j=M.data[i].j;
            Q.data[k].e=M.data[i].e;
            k++;
        }
    if(j!=N.tu+1)
        for(; j<=N.tu; j++)
        {
            Q.data[k].i=N.data[j].i;
            Q.data[k].j=N.data[j].j;
            Q.data[k].e=N.data[j].e;
            k++;
        }
    for(i=1,j=1; i<=Q.mu; i++)      //求Q.rpos[i]
    {
        Q.rpos[i]=j;
        while(Q.data[j].i==i && j<=Q.tu)        //若某一行的元素多于1个时
            j++;
    }
    return OK;
}
 //相减 
void SubtSMatrix(RLSMatrix M,RLSMatrix &N,RLSMatrix &Q)
{ 
    int i=1;
    for(; i<=N.tu; i++)
    {
        N.data[i].e=-N.data[i].e;
    }
    AddSMatrix(M,N,Q);
}
//输出 
void PrintSMatrix(RLSMatrix M)
{
    int k,l,n;
    for(k=1,n=1; k<=M.mu; k++)
    {
        for(l=1; l<=M.nu; l++)
        {
            if(M.data[n].i==k && M.data[n].j==l)
            {
                printf("%5d",M.data[n].e);
                n++;
            }
            else
                printf("%5d",0);
        }
        printf("\n");
    }
    printf("\n");
 
}
//销毁 
int Destory_SMatrix(RLSMatrix &M)
{
    M.mu=M.nu=M.tu=0;
    return 1;
}
//------------------主函数------------------ 
int main()
{
    RLSMatrix A,B,C;
    int flag;
    while(1)
    {
        printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");
        printf("         稀疏矩阵的加、减、乘         \n");
        printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");
        printf("           1、稀疏矩阵的加法                           \n");
        printf("           2、稀疏矩阵的减法                           \n");
        printf("           3、退出程序                                        \n");
        printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");
        printf("注意:稀疏矩阵的行列不能超过20!!!\n");
		printf("输入要进行的运算功能的编号:");
        scanf("%d",&flag);
        if(flag==3)
        {
            printf("     \n程序已退出!!!    \n");
            exit(0);
        }
        switch(flag)
        {
        case 1:	//加法
            CreatSMatrix(A);
            printf("矩阵A=\n");
            PrintSMatrix(A);
            CreatSMatrix(B);
            printf("矩阵B=\n");
            PrintSMatrix(B);
            if(A.mu==B.mu  && A.nu==B.nu)
            {
                printf("A+B=\n");
                AddSMatrix(A,B,C);
                PrintSMatrix(C);
            }
            else
                printf("错误!两矩阵的行列数不一致\n");
            break;
        case 2://减法
            CreatSMatrix(A);
            printf("矩阵A=\n");
            PrintSMatrix(A);
            CreatSMatrix(B);;
            printf("矩阵B=\n");
            PrintSMatrix(B);
            if(A.mu==B.mu  && A.nu==B.nu)
            {
                printf("A-B=\n");
                SubtSMatrix(A,B,C);
                PrintSMatrix(C);
            }
            else
                printf("错误!两矩阵的行列数不一致\n");
            break;
        default:
            printf("输入错误!\n");
        }
        Destory_SMatrix(A);
        Destory_SMatrix(B);
        Destory_SMatrix(C);
    }
    return 0;
}
  
举报

相关推荐

0 条评论