数据结构作业系统-第五章答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档