数据结构课程设计-稀疏矩阵实现与应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5、时间复杂度的分析:-----------------------------------------------------------------------------------12 6、源程序清单和执行结果--------------------------------------------------------------------------------12 7、C 程序设计总结-----------------------------------------------------------------------------------------20 8、致谢--------------------------------------------------------------------------------------------------------20 9、参考文献--------------------------------------------------------------------------------------------------20
元素在三元组中出现的位置
return true; } 矩阵的乘法函数 bool MultSMatrix() // 两个矩阵相乘 {
RLSMatrix M, N, Q; // 构建三个带“链接信息”的三元组表示的数组 InPutTSMatrix(M, 1); // 用普通三元组形式输入数组 Inห้องสมุดไป่ตู้utTSMatrix(N, 1); Count(M); Count(N); cout << "输入的两矩阵的乘矩阵为:" << endl; if (M.nu != N.mu) return false; Q.mu = M.mu; Q.nu = N.nu; Q.tu = 0; // Q初始化 int ctemp[MAXROW + 1]; // 辅助数组 int arow, tp, p, brow, t, q, ccol; if (M.tu * N.tu) // Q是非零矩阵 {
{ ccol = N.data[q].j; ctemp[ccol] += M.data[p].e * N.data[q].e; // 将乘得到对应值放
在相应的元素累加器里面
} } for (ccol = 1; ccol <= Q.nu; ccol++) // 对已经求出的累加器中的值压缩到 Q中
请选择要进行的操作:" << endl;
cout << "
1:矩阵的转置。" << endl;
cout << "
2:矩阵的加法。" << endl;
cout << "
3:矩阵的乘法。" << endl;
cout << "
4:退出程序。" << endl;
while(t)
{
第3页
cout<<"请输入您要进行的操作:"<<endl;
typedef struct { // 定义十字链表对象结构体
OLink *rhead, *chead;
int mu, nu, tu; // 系数矩阵的行数,列数,和非零元素个数
} CrossList; // 定义十字链表对象结构体
2.主函数
int main()
{
int t;
cout.fill('*');
cout << setw(80) << '*';
cout.fill(' ');
cout << setw(50) << "***欢迎使用矩阵运算程序***" << endl; //输出头菜单
cout.fill('*');
cout << setw(80) << '*';
cout.fill(' ');
cout << "
for (arow = 1; arow <= M.mu; arow++) {
///memset(ctemp,0,N.nu); for (int x = 1; x <= N.nu; x++) // 当前行各元素累加器清零
ctemp[x] = 0; Q.rpos[arow] = Q.tu + 1; // 当前行的首个非零元素在三元组中的位置为此 行前所有非零元素+1 if (arow < M.mu) tp = M.rpos[arow + 1]; else tp = M.tu + 1; for (p = M.rpos[arow]; p < tp; p++) // 对当前行每个非零元素进行操作 {
cin>>t; switch(t) { case 1:
TransposeSMatrix(); //调用矩阵转置函数 break; case 2: AddSMatrix(); //调用矩阵相加函数 break; case 3: MultSMatrix(); //调用矩阵相乘函数 break; case 4: t=0; break; } } return 0; } 矩阵的转置函数
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) {
1、数据结构课程设计任务书 1.1、题目
实现三元组,十字链表下的稀疏矩阵的加、转、乘的实现。
1.2、要求
(1).设计函数建立稀疏矩阵,初始化值; (2).设计函数输出稀疏矩阵的值; (3).构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵; (4).构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵; (5).构造函数进行稀疏矩阵的转置,并输出结果; (6).退出系统。
} RLSMatrix; // 定义带链接信息的三元组对象
typedef struct OLNode { // 定义十字链表元素 int i, j; int e; struct OLNode *right, *down; // 该非零元所在行表和列表的后继元素
} OLNode, *OLink; // 定义十字链表元素
第5页
brow = M.data[p].j; // 在N中找到i值也操作元素的j值相等的行 if (brow < N.mu) t = N.rpos[brow + 1]; else t = N.tu + 1; for (q = N.rpos[brow]; q < t; q++) // 对找出的行当每个非零元素进行操 作
for (p = 1; p <= M.tu; p++) {
int col = M.data[p].j; q = cpot[col]; T.data[q].i = M.data[p].j; T.data[q].j = M.data[p].i; T.data[q].e = M.data[p].e;
求出每一列中非
第4页
++cpot[col]; } } cout << "输入矩阵的转置矩阵为" << endl; OutPutSMatrix(T); return true; }
bool Count(RLSMatrix &T) { int num[MAXROW + 1]; for (int row = 1; row <= T.mu; row++) num[row] = 0; for (int col = 1; col <= T.tu; col++) ++num[T.data[col].i]; T.rpos[1] = 1; for (int i = 2; i <= T.mu; i++) T.rpos[i] = T.rpos[i - 1] + num[i - 1]; // 求取每一行中非零
2、总体设计 -------------------------------------------------------------------------------------------------1 2.1、功能模块设计--------------------------------------------------------------------------------------1 2.2、所有功能模块的流程图--------------------------------------------------------------------------2
安徽省巢湖学院计算机与信息工程学院
课程名称 课题名称 专业 班级 学号 姓名 联系方式 指导教师
课程设计报告
《数据结构》 稀疏矩阵实现与应用
计算机科学与技术
20 11 年 12 月 25 日
目录
1、数据结构课程设计任务书1 1.1、题目-------------------------------------------------------------------------------------------------1 1.2、要求-------------------------------------------------------------------------------------------------1
2、总体设计 2.1、功能模块设计
矩阵相加
输入矩阵 1 输入矩阵 2
计算结果
矩阵相减 输入矩阵 1 输入矩阵 2
计算结果
矩阵转置 输入矩阵
计算结果
退出
第1页
2.2、所有功能模块的流程图
第2页
3、详细设计
1. 定义程序中所有用到的数据及其数据结构,及其基本操作的实现; typedef struct {
3、详细设计----------------------------------------------------------------------------------------------------3 3.1、程序中所采用的数据结构及存储结构的说明---------------------------------------------10 3.2、算法的设计思想----------------------------------------------------------------------------------10 3.3、稀疏矩阵各种运算的性质变换----------------------------------------------------------------10
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; for (int i = 2; i <= M.nu; i++) cpot[i] = cpot[i - 1] + num[i - 1]; // 零元素在三元组中出现的位置
4、调试与测试:--------------------------------------------------------------------------------------------10 4.1、调试方法与步骤: -----------------------------------------------------------------------------10 4.2、测试结果的分析与讨论:----------------------------------------------------------------------11
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;
相关文档
最新文档