广东工业大学数据结构实验报告
题目: 稀疏矩阵
1.题目: 抽象数据类型稀疏矩阵 ADT 定义如下:
ADT SparseMatrix{
数据对象:D={aij| i=1,2,...,m; j=1,2,...,n;
aij∈ElemSet, m 和n分别称为矩阵的行数和列数}
数据关系:R={Row,Col}
Row={<ai,j,ai,j+1>| 1<=i<=m,1<=j<=n-1}
Col={<ai,j,ai,j+1> | 1<=i<=m-1,1<=j<=n}
基本操作:
Status CreateSMatrix(TSMatrix &M)
操作结果:创建稀疏矩阵M
Status DestroySMatrix(TSMatrix &M)
初始条件:稀疏矩阵M已经存在
操作结果:销毁矩阵M
void PrintSMatrix(TSMatrix M)
初始条件:稀疏矩阵M已经存在
操作结果:打印矩阵M
Status CopySMatrix(TSMatrix M, TSMatrix &T)
初始条件:稀疏矩阵M已经存在
操作结果:复制矩阵M到T
Status AddSMatrix(TSMatrix M, TSMatrix N, TSMatrix &Q)
初始条件:稀疏数组M、N的行数和列数对应相等
操作结果:求矩阵的和Q=M+N
Status SubSMatrix(TSMatrix M, TSMatrix N, TSMatrix &Q)
初始条件:稀疏数组M、N的行数和列数对应相等
操作结果:求矩阵的差Q=M-N
Status TransposeSMatrix(TSMatrix M, TSMatrix & T)
初始条件:稀疏数组M已经存在
操作结果:求矩阵M的转置T
Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix &Q)
初始条件:稀疏数组M的列数等于N的行数
操作结果:求矩阵的积Q=M*N
StatusFindElem(TSMatrix M, int row, int col, ElemType &e)
初始条件:稀疏数组M存在
操作结果:查找第row行,第col列元素,若不为0则用e返回其值
StatusInsertElem(TSMatrix &M, int row, int col, ElemType e)
初始条件:稀疏数组M存在
操作结果:在第row行,第col列位置插入元素e
StatusDeleteElem(TSMatrix &M, int row, int col, ElemType &e)
初始条件:稀疏数组M存在
操作结果:删除第row行,第col列元素
StatusIsEmptyMatrix(TSMatrix M)
操作结果:判断是否为空矩阵
}ADT SparseMatrix
2.存储结构定义
稀疏矩阵的三元组顺序表存储表示
#define MAXSIZE 50
typedef struct {
int i, j;
ElemType e;
}Triple;
typedef struct {
Tripledata[MAXSIZE+1];
intmu, nu, tu;
}TSMatrix;
3. 算法设计
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1;
#define FALSE 0;
#define OK 1
#define ERROR 0;
typedef intStatus;
typedef intElemType;
/* 稀疏矩阵的三元组顺序表存储表示 */
#define MAXSIZE 50
typedef struct {
int i, j;
ElemType e;
}Triple;
typedef struct {
Triple data[MAXSIZE+1]; //这里可用数组实现也可用指针实现
int mu, nu, tu;
}TSMatrix;
//对三元组表示的稀疏矩阵进行排序
//需要排序是因为创建三元组时可以任意不按顺序输入
voidOrder(TSMatrix &M){
int a, b;
Triple t;
for(a=1; a<M.tu; a++){ //冒泡排序
for(b=a+1; b<M.tu+1; b++){
if(M.data[a].i > M.data[b].i){ //如果前面一个行号比后面一 //个行号大,就交换
t = M.data[a];
M.data[a] = M.data[b];
M.data[b] = t;
}
if(M.data[a].i ==M.data[b].i){ //行号相等,列号大的在后面
if(M.data[a].j >M.data[b].j){
t = M.data[a];
M.data[a] = M.data[b];
M.data[b] = t;
}
}
}
}
}
//销毁稀疏矩阵M
StatusDestroySMatrix(TSMatrix &M){ //要想销毁一个三元组表示的 //矩阵就必须销毁四部分
int num = M.tu; //M.mu,M.nu,M.tu和M.data[]
M.mu = 0;
M.nu = 0;
M.tu = 0;
for(int k=1; k<=num; k++){ //因为用数组实现,又数组为静 // 态分配,故销毁数组只能置其内容为0
M.data[k].i = 0; // 而不能释放其空间
M.data[k].j = 0;
M.data[k].e = 0;
}
return OK;
}
//创建稀疏矩阵M
StatusCreateSMatrix(TSMatrix &M){
if(M.tu != 0) //M如果非空
DestroySMatrix(M);
int m, n, t, i, j, e;
int flag = 0; //flag用来标志输入是否重复
printf("请输入矩阵的行数、列数和非零元个数(格式为:X,X,X)\n");
while(1){
scanf("%d,%d,%d",&m,&n,&t);
if(t<=0 || m<=0 || n<=0){ //输入的行列数要为整数
printf("对不起,您输入有误!请重新输入!\n");
printf("请输入矩阵的行数、列数和非零元个数(格式为:X,X,X)\n");
}else if(t > m*n){ //非零元个数不能大于矩阵最大个数
printf("对不起,您输入的非零元个数不合理!请重新输入!\n");
printf("请输入矩阵的行数、列数和非零元个数(格式为:X,X,X)\n");
}else //输入正确
break;
}
M.mu = m; M.nu = n; M.tu = t;
printf("请输入你想创建的稀疏矩阵:(格式为:X,X,X)\n");
for(int k=1; k<=M.tu; k++){
scanf("%d,%d,%d",&i,&j,&e);
if(i > M.mu){
printf("输入有误,行号过大,请重新输入!\n");
k--;
}else if(i <= 0){
printf("输入有误,行号必须为正数,请重新输入!\n");
k--;
}else if(j <= 0){
printf("输入有误,列号必须为正数,请重新输入!\n");
k--;
}else if(j > M.nu){
printf("输入有误,列号过大,请重新输入!\n");
k--;
}else if(e == 0){
printf("输入有误,值不能为零,请重新输入!\n");
k--;
}else {
for(int t=1; t<=k; t++){
if(i==M.data[t].i &&j==M.data[t].j){
printf("输入有误,您输入的下标重复,请重新输入!\n");
k--;
flag = 1;
break;
}
}
if(flag == 0){ //输入完全正确情况下
M.data[k].i = i;
M.data[k].j = j;
M.data[k].e = e;
}
}
}
//对三元组表示的稀疏矩阵进行排序
Order(M);
printf("*矩阵已完成创建!*\n");
return OK;
}
//输出稀疏矩阵M
voidPrintSMatrix(TSMatrix M){
printf("\t-----------------");
printf("\n");
printf("\t%c\t%c\t%c",'i','j','e');
printf("\n");
printf("\t-----------------");
printf("\n");
if(M.tu == 0) //如果为空
printf("\t这是一个空的矩阵\n");
else{
for(int k=1; k<=M.tu; k++){
printf("\t%d\t%d\t%d",M.data[k].i,M.data[k].j,M.data[k].e);
printf("\n");
}
}
printf("\t-----------------");
printf("\n\n");
}
//查找三元组表示的稀疏矩阵M中,第row行,第col列元素,若不为0则用e返回其值
StatusFindElem(TSMatrix M, int row, int col, ElemType &e){
for(int k=1; k<=M.tu; k