资源简介
分别用三元组和十字链表两种方法实现了稀疏矩阵的相加和相乘
代码片段和文件信息
/*
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
- 上一篇:SD卡初始化流程图超详细
- 下一篇:《操作系统概念》第七版1-13章答案含代码
评论
共有 条评论