数据结构作业系统-第五章答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5.21④假设稀疏矩阵A和B均以三元组表作为存储结构。
试写出矩阵相加的算法,另设三元组表C存放结果矩阵。
要求实现以下函数:
Status AddTSM(TSMatrix A,TSMatrix B,TSMatrix &C);
/* 三元组表示的稀疏矩阵加法: C=A+B */
稀疏矩阵的三元组顺序表类型TSMatrix的定义:
#define MAXSIZE 20 // 非零元个数的最大值
typedef struct {
int i,j; // 行下标,列下标
ElemType e; // 非零元素值
}Triple;
typedef struct {
Triple data[MAXSIZE+1]; // 非零元三元组表,data[0]未用
int mu,nu,tu; // 矩阵的行数、列数和非零元个数
}TSMatrix;
Status AddTSM(TSMatrix A,TSMatrix B,TSMatrix &C)
/* 三元组表示的稀疏矩阵加法: C=A+B */
{
int k=1,n=1,p=1;
ElemType ce;
if(A.mu!=B.mu||A.nu!=B.nu)return ERROR;
while(k<=A.tu&&n<=B.tu)
{
if(A.data[k].i==B.data[n].i&&A.data[k].j==B.data[n].j)
{
ce=A.data[k].e+B.data[n].e;
if(ce)
{
C.data[p].i=A.data[k].i;
C.data[p].j=A.data[k].j;
C.data[p].e=ce;
p++;
//printf("%d,,%d ",ce,C.data[p-1].e);
}
k++;n++;
}
else if(A.data[k].i C.data[p].e=A.data[k].e; C.data[p].i=A.data[k].i; C.data[p].j=A.data[k].j; k++;p++; } else { C.data[p].e=B.data[n].e; C.data[p].i=B.data[n].i; C.data[p].j=B.data[n].j; n++; p++; } } if(k>A.tu) while(n<=B.tu) { C.data[p].e=B.data[n].e; C.data[p].i=B.data[n].i; C.data[p].j=B.data[n].j; n++;p++; printf("%d B ",B.data[n].e); } else while(k<=A.tu) { C.data[p].e=A.data[k].e; C.data[p].i=A.data[k].i; C.data[p].j=A.data[k].j; k++;p++; printf("%d A ",C.data[p].e); } C.mu=A.mu; C.nu=A.nu; C.tu=p-1; return TRUE; } 5.23②三元组表的一种变型是,从三元组表中去掉 行下标域得到二元组表,另设一个行起始向量,其每个分量是二元组表的一个下标值,指示该行中第一个非零元素在二元组表中的起始位置。试编写一个算法,由矩阵元素的下标值i,j求矩阵元素。试讨论这种方法和三元组表相比有什么优缺点。 要求实现以下函数: Status GetElem(T2SMatrix M, int i, int j, ElemType &e); /* 求二元组矩阵的元素A[i][j]的值e */ 稀疏矩阵的二元组顺序表+行起始向量的类型T2SMatrix的定义: typedef struct{ int j; ElemType e; }TwoTuples; typedef struct{ TwoTuples data[MAXSIZE]; int cpot[MAXROW]; // 这个向量存储每一行在二元组中的起始位置int mu,nu,tu; } T2SMatrix; // 二元组矩阵类型 Status GetElem(T2SMatrix M, int i, int j, ElemType &e) /* 求二元组矩阵的元素A[i][j]的值e */ { int k; if(i>M.mu||j>M.nu||i<1||j<1)return ERROR; for(k=M.cpot[i];k { if(M.data[k].j==j) { e=M.data[k].e; return OK; } } e=0; return OK; } 5.26③试编写一个以三元组形式输出用十字链表 表示的稀疏矩阵中非零元素及其下标的算法。 要求实现以下函数: void OutCSM(CrossList M, void(*Out3)(int, int, int)); /* 用函数Out3,依次以三元组格式输出十字链表表示的矩阵*/ 稀疏矩阵的十字链表存储表示: typedef struct OLNode { int i,j; // 该非零元的行和列下标 ElemType e; // 非零元素值 OLNode *right,*down; // 该非零元所在行表和列表的后继链域 }OLNode, *OLink;