数据结构-稀疏矩阵-实验报告与代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一.需求分析
输入要求:稀疏矩阵的行、列和非零元素个数
输出要求:稀疏矩阵的转置、加法、减法、乘法
二.算法设计
本程序中采用的数据模型,用到的抽象数据类型的定义,程序的主要算法流程及各模块之间的层次调用关系
1.抽象数据类型:
ADT List {
数据对象:D={ai:|ai∈ElemSet,i=1…n,n≥0}
数据关系:R={Row,Col}
Row={
Col={
基本操作:
Status CreateSMatrix(TSMatrix &M)
操作结果:初始化稀疏数组
void PrintSMatrix(TSMatrix M)
初始条件:稀疏数组M已经存在
操作结果:打印矩阵M
void DestroySMatrix(TSMatrix &M)
初始条件:稀疏数组M已经存在
操作结果:销毁矩阵M
void 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已经存在
操作结果:求矩阵的积Q=M*N
}ADT List
2. 本程序有二个模块:
(1)主程序模块
main()
{
初始化;
{
接受命令;
显示结果;
}
}
(2)三元组表单元模块:实现矩阵抽象数据类型。
三.程序设计
根据算法设计中给出的有关数据和算法,选定物理结构,详细设计需求分析中所要求的程序。包括:人机界面设计、主要功能的函数设计、函数之间调用关系描述等。
1、程序基本结构:
2、稀疏矩阵的三元组顺序表存储表示:
typedef struct { // 定义三元组的元素
int i, j;
int e;
} Triple;
typedef struct { // 定义普通三元组对象
Triple data[MAXSIZE + 1];
int mu, nu, tu;
} TSMatrix;
typedef struct { // 定义带链接信息的三元组对象Triple data[MAXSIZE + 2];
int rpos[MAXROW + 1];
int mu, nu, tu;
} RLSMatrix;
3、基本函数:
1)输入矩阵,按三元组格式输入
bool InPutTSMatrix(P & T, int y) {
cout << "输入矩阵的行,列和非零元素个数:" << endl;
cin >> T.mu >> T.nu >> T.tu;
cout << "请输出非零元素的位置和值:" << endl;
int k = 1;
for (; k <= T.tu; k++)
cin >> T.data[k].i >> T.data[k].j >> T.data[k].e;
return true;
}
2)输出矩阵,按标准格式输出
bool OutPutSMatrix(P T) {
int m, n, k = 1;
for (m = 0; m < T.mu; m++) {
for (n = 0; n < T.nu; n++) {
if ((T.data[k].i - 1) == m && (T.data[k].j - 1) == n) {
cout.width(4);
cout << T.data[k++].e;
} else {
cout.width(4);
cout << "0";
}
}
cout << endl;
}
return true;
}
3)求矩阵的转置矩阵
bool TransposeSMatrix() {
TSMatrix M, T; //定义预转置的矩阵
InPutTSMatrix(M, 0); //输入矩阵
int num[MAXROW + 1];
int cpot[MAXROW + 1]; //构建辅助数组
int q, p, t;
T.tu = M.tu;
T.mu = M.nu;
T.nu = M.mu;
if (T.tu) {
for (int col = 1; col <= M.nu; col++) num[col] = 0;
for (t = 1; t <= M.tu; t++) ++num[M.data[t].j];
cpot[1] = 1;