资源简介

分别用三元组和十字链表两种方法实现了稀疏矩阵的相加和相乘

资源截图

代码片段和文件信息

/*
  Name: 稀疏矩阵相加、相乘 
  Copyright: 
  Author: 宋思奇,刘磊,王沛 
  Date: 26-10-08 21:54
  Description: 第二次上机作业: 
               假设稀疏矩阵A和B均以三元组表作为存储结构,试写出矩阵相加(相乘—选做)的算法,
               另设三元组表C存放结果矩阵。
*/
#include 
#include 
//函数结果状态码
#define OK        1
#define ERROR     0
#define OVERFLOW -1 
//Status是函数的类型,其值是函数结果状态代码
typedef int Status;
// ----- 稀疏矩阵的三元组顺序表存储表示 -----
#define MAXSIZE 100                      //假设非零元个数的最大值为100
#define MAXRC   100
typedef struct {
        int ij;                           //非零元的行下标和列下标
        int e;                             //非零元的值
}Triple;
typedef struct {
        Triple data[MAXSIZE + 1];          //非零元三元组表,data[0]未用
        int    rpos[MAXRC + 1];            //各行的第一个非零元的位置表 
        int    mu nu tu;                 //矩阵的行数、列数和非零元个数 
}RLSMatrix;

Status CreateSMatrix(RLSMatrix *M);                            //创建稀疏矩阵M,采用三元组存储
Status PrintSMatrix(RLSMatrix M);                              //输出稀疏矩阵M
Status AddSMatrix(RLSMatrix M RLSMatrix N RLSMatrix *Q);     //求稀疏矩阵的和Q = M + N
Status MultSMatrix(RLSMatrix M RLSMatrix N RLSMatrix *Q);    //求稀疏矩阵乘积Q = M ×N 

main()
{
    RLSMatrix A B C;//稀疏矩阵A、B和C均以三元组表作为存储结构,C存放A、B相加相乘的结果 
    //创建稀疏矩阵A、B
    printf(“请输入稀疏矩阵A\n“); 
    CreateSMatrix(&A);
    printf(“稀疏矩阵A为:\n“);
    PrintSMatrix(A);
    printf(“\n\n“);
    printf(“请输入稀疏矩阵B\n“);
    CreateSMatrix(&B);
    printf(“稀疏矩阵B为:\n“);
    PrintSMatrix(B);
    printf(“\n\n“);
    //求稀疏矩阵的和C = A + B,并输出相加结果矩阵C 
    if(AddSMatrix(A B &C))
    {
         printf(“求疏矩阵的和C = A + B,并输出相加结果矩阵C:\n“);
         PrintSMatrix(C);
         printf(“\n“);
    }
    else printf(“两个矩阵行列数不完全相等,不是同类矩阵,不能相加。\n“ );
    
    //求稀疏矩阵乘积C = A ×B,并输出相乘结果矩阵C
    if(MultSMatrix(A B &C))
    {
         printf(“稀疏矩阵乘积C = A ×B,并输出相乘结果矩阵C:\n“);
         PrintSMatrix(C);
         printf(“\n“);
    }
    else printf(“稀疏矩阵A的列数和B的行数不相等,不能相乘。\n“);
    printf(“\n“);
    //程序结束
    system(“pause“);
    return 0; 
}
//创建稀疏矩阵M,采用三元组表存储表示
Status CreateSMatrix(RLSMatrix *M)
{
       int m n t e;                //行数m,列数n,非零元个数t和非零元值e 
       int i j k a b;                   //中间变量
       int num[MAXSIZE];              //每行非零元素个数
       int flag [MAXSIZE][MAXSIZE];   //标记数组:此位置是否已经有非零元素 
       
       for(i = 0; i < MAXSIZE; i++)   //标记数组的初始化 
            for(j = 0; j < MAXSIZE; j++)
                 flag [i][j] = 0;
                  
       //输入M的行数、列数和非零元个数
       do {
          printf(“请分别输入矩阵的行数、列数和非零元个数:\n“); 
          printf(“行数:“);
          scanf(“%d“ &m);
          printf(“列数:“);
          scanf(“%d“ &n);
          printf(“非零元的个数:“);
          scanf(“%d“ &t);
          if(m < 0 || n < 0 || t < 0 || t > m * n) printf(“输入的数据不符合要求!!!“);
       } while(m < 0 || n < 0 || t < 0 || t > m * n);
       M->mu = m M->nu = n M->tu = t;//保存 
       //按行序输入非零元
       if(t == 0) return OK;
       for(k = 1; k <= t; k++)
       {
       

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       9785  2008-11-03 23:03  稀疏矩阵相加相乘\稀疏矩阵相加相乘(三元组).c

     文件      15530  2008-10-30 22:21  稀疏矩阵相加相乘\稀疏矩阵相加相乘(十字链表).cpp

     目录          0  2009-09-30 14:16  稀疏矩阵相加相乘

----------- ---------  ---------- -----  ----

                25315                    3


评论

共有 条评论