版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据结构课 程 设 计 报 告 书题 目: 稀疏矩阵的加减法 专 业: 计算机科学与技术 学 号: 学生姓名: 指导教师: 完成日期: 2016-06-20 稀疏矩阵的加减法运算1. 题目描述假设稀疏矩阵A和B(m行n列)都采用三元组表示,编写程序计算CA+B,D=A-B,矩阵C和D也采用三元组表示。编写程序实现,并输出结果。2. 预备知识 函数模块调用关系 三元组中抽象数据类型定义 三元组表的赋值操作 三元组和稀疏矩阵之间的转换3. 问题分析该程序主要实现以下功能:(1)用三元组存储方式创建稀疏矩阵;(2)用三元组存储方式进行稀疏矩阵的加法;(3)用三元组存储方式进行稀疏矩阵的减法;程序流程
2、和设计思想可以用以下流程图来描述:输入menu中的编号2. 求两个矩阵相减差1. 求两个矩阵相加和 0. 退出系统运行结果并显示出来 图1.程序运行流程图4. 数据结构设计抽象数据类型定义三元组中抽象数据类型定义 typedef struct /三元组表中元素类型的定义int i,j;int e;Triple; typedef struct a) Triple dataMAX+1; /存放非零元素的数组,行优先b) int row,nu,tu;Matrix; /三元组表类型名 InitMatrix(A); /初始化 AddMatrix(A,B,C);/矩阵相加 SubMatrix(A,B,C)
3、;/矩阵相减5. 模块设计 void InitMatrix(Matrix &M) /初始化三元组矩阵int num=0;M=*(Matrix *)malloc(sizeof(Matrix); /为三元组申请内存 printf("请输入矩阵的行、列和非零元素个数:n");scanf("%d %d",&M.row,&M.nu); /输入矩阵的行、列和非零元素个数 printf("请输入矩阵的非零元值:n"); scanf("%d",&num);getchar();M.tu=num;for
4、(int i=1;i<=M.tu;i+) /输入三元组 printf("请输入第%d个非零元值:n",i); scanf("%d%d%d",&M.datai.i,&M.datai.j,&M.datai.e); getchar(); void AddMatrix(Matrix A,Matrix B,Matrix &C) /将A,B的值相加放到C上 C=*(Matrix *)malloc(sizeof(Matrix); /为三元组C申请内存 int i=1,j=1,k=1; int v; if(A.row!=B.row|
5、A.nu!=B.nu) /判断A、B的行列数是否相等 printf("error!n"); else C.row=A.row; /把A的行数赋给C C.nu=A.nu; /把A的列数赋给C while(i<=A.tu&&j<=B.tu) if(A.datai.i=B.dataj.i) /如果三元组A的行下标与B的行下标相等 if(A.datai.j<B.dataj.j)/如果三元组A的列下标小于B的行下标 C.datak.i=A.datai.i;/把当前三元组A行下标i插入三元组C C.datak.j=A.datai.j;/把当前三元组A下
6、列标j插入三元组C C.datak.e=A.datai.e;/把当前三元组A下标i对于的数值e插入三元组C k+; i+; else if(A.datai.j>B.dataj.j)/如果三元组A的列下标大于B的行下标 C.datak.i=B.dataj.i; C.datak.j=B.dataj.j; C.datak.e=B.dataj.e; k+; j+; else /如果三元组A的列下标等于B的行下标 v=A.datai.e+B.dataj.e; if(v!=0) C.datak.i=A.datai.i; /把当前三元组A行下标i插入三元组C C.datak.j=A.datai.j;
7、/把当前三元组A下列标j插入三元组C C.datak.e=v; /把三元组A-B下标i对于的数值v插入三元组C k+; i+; j+; else if(A.datai.i<B.dataj.i) /如果三元组A的行下标小于B的行下标 C.datak.i=A.datai.i; /把当前三元组A行下标i插入三元组C C.datak.j=A.datai.j; /把当前三元组A下列标j插入三元组C C.datak.e=A.datai.e; /把当前三元组A下标i对于的数值e插入三元组C k+; i+; else C.datak.i=B.dataj.i;/把当前三元组B下行标i插入三元组C C.da
8、tak.j=B.dataj.j;/把当前三元组B下列标j插入三元组C C.datak.e=B.dataj.e;/把当前三元组B下标i对于的数值e插入三元组C k+; j+; while(i<=A.tu) C.datak.i=A.datai.i;/把当前三元组A下行标i插入三元组C C.datak.j=A.datai.j;/把当前三元组A下列标j插入三元组C C.datak.e=A.datai.e;/把当前三元组A下标i对于的数值e插入三元组C k+; i+; while(j<=B.tu) C.datak.i=B.dataj.i;/把当前三元组B下行标i插入三元组C C.datak.
9、j=B.dataj.j;/把当前三元组B下列标j插入三元组C C.datak.e=B.dataj.e;/把当前三元组B下标i对于的数值e插入三元组C k+; j+; C.tu=k-1; void SubMatrix(Matrix A,Matrix B,Matrix &C) C=*(Matrix *)malloc(sizeof(Matrix); int i=1,j=1,k=1; int v; if(A.row!=B.row|A.nu!=B.nu) /判断A、B的行列数是否相等 printf("error!n"); else C.row=A.row; C.nu=A.nu
10、; while(i<=A.tu&&j<=B.tu) if(A.datai.i=B.dataj.i) if(A.datai.j<B.dataj.j) C.datak.i=A.datai.i;/把当前三元组A下行标i插入三元组C C.datak.j=A.datai.j;/把当前三元组A下列标j插入三元组C C.datak.e=A.datai.e;/把当前三元组A下标i对于的数值e插入三元组C k+; i+; else if(A.datai.j>B.dataj.j) C.datak.i=B.dataj.i;/把当前三元组B下行标i插入三元组C C.datak.
11、j=B.dataj.j;/把当前三元组B下列标j插入三元组C C.datak.e=B.dataj.e;/把当前三元组B下标i对于的数值e插入三元组C k+; j+; else v=A.datai.e-B.dataj.e; if(v!=0) C.datak.i=A.datai.i;/把当前三元组A下行标i插入三元组C C.datak.j=A.datai.j;/把当前三元组A下列标j插入三元组C C.datak.e=v; /把三元组A-B下标i对于的数值v插入三元组C k+; i+; j+; else if(A.datai.i<B.dataj.i) C.datak.i=A.datai.i;/
12、把当前三元组A下行标i插入三元组C C.datak.j=A.datai.j;/把当前三元组A下列标j插入三元组C C.datak.e=A.datai.e;/把当前三元组A下标i对于的数值e插入三元组C k+; i+; else C.datak.i=B.dataj.i;/把当前三元组B下行标i插入三元组C C.datak.j=B.dataj.j;/把当前三元组B下列标j插入三元组C C.datak.e=B.dataj.e;/把当前三元组B下标i对于的数值e插入三元组C k+; j+; while(i<=A.tu) C.datak.i=A.datai.i;/把当前三元组A下行标i插入三元组C
13、 C.datak.j=A.datai.j;/把当前三元组A下列标j插入三元组C C.datak.e=A.datai.e;/把当前三元组A下标i对于的数值e插入三元组C k+; i+; while(j<=B.tu) C.datak.i=B.dataj.i;/把当前三元组B下行标i插入三元组C C.datak.j=B.dataj.j;/把当前三元组B下列标j插入三元组C C.datak.e=B.dataj.e;/把当前三元组B下标i对于的数值e插入三元组C k+; j+; C.tu=k-1; void ShowMatrix(Matrix M) /输出三元组矩阵 printf("nn
14、矩阵信息:n");printf("row:%d nu:%d tu:%dn",M.row,M.nu,M.tu);printf(" i j kn");for(int i=1;i<=M.tu;i+) printf(" %d, %d, %d,n",M.datai.i,M.datai.j,M.datai.e); /输出三元组 int main( ) char x=' ' cout<<"t *"<<endl; cout<<"t 请选择相应的功能: &
15、quot;<<endl; cout<<"t -"<<endl; cout<<"t 1. 求两个矩阵相加和 "<<endl; cout<<"t -"<<endl; cout<<"t 2. 求两个矩阵相减差 "<<endl; cout<<"t -"<<endl; cout<<"t 0. 退出系统 "<<endl; cout&l
16、t;<"t "<<endl; int flag=1;while(flag)printf("请选择相应的功能:");int s;scanf("%d",&s);getchar();/输入menu编号 switch(s) case 1:Matrix A,B,C;printf("请输入第一个矩阵:n"); InitMatrix(A); /初始化 printf("请输入第二个矩阵:n"); InitMatrix(B); /初始化 printf("矩阵的和为:n"
17、;);AddMatrix(A,B,C); ShowMatrix(C);/输出三元组表 break; case 2:Matrix A,B,C;printf("请输入第一个矩阵:n"); InitMatrix(A);/初始化 printf("请输入第二个矩阵:n"); InitMatrix(B);/初始化 printf("矩阵的差为:n"); SubMatrix(A,B,C); ShowMatrix(C);/输出三元组表 break; case 0:flag=0;break; 6. 运行界面及运算结果图5-1图5-2图5-3图5-4附录:
18、#include<stdio.h>#include<stdlib.h>#include<iostream>using namespace std;#define MAX 1000/三元组typedef struct /三元组表中元素类型的定义int i,j;int e;Triple;typedef struct Triple dataMAX+1; /存放非零元素的数组,行优先int row,nu,tu;Matrix; /三元组表类型名 void InitMatrix(Matrix &M) /初始化三元组矩阵int num=0;M=*(Matrix *
19、)malloc(sizeof(Matrix); /为三元组申请内存 printf("请输入矩阵的行、列和非零元素个数:n");scanf("%d %d",&M.row,&M.nu); /输入矩阵的行、列和非零元素个数 printf("请输入矩阵的非零元值:n"); scanf("%d",&num);getchar();M.tu=num;for(int i=1;i<=M.tu;i+) /输入三元组 printf("请输入第%d个非零元值:n",i); scanf(&q
20、uot;%d%d%d",&M.datai.i,&M.datai.j,&M.datai.e); getchar();void ShowMatrix(Matrix M) /输出三元组矩阵 printf("nn矩阵信息:n");printf("row:%d nu:%d tu:%dn",M.row,M.nu,M.tu);printf(" i j kn");for(int i=1;i<=M.tu;i+) printf(" %d, %d, %d,n",M.datai.i,M.datai.
21、j,M.datai.e); /输出三元组void AddMatrix(Matrix A,Matrix B,Matrix &C) /将A,B的值相加放到C上 C=*(Matrix *)malloc(sizeof(Matrix); /为三元组C申请内存 int i=1,j=1,k=1; int v; if(A.row!=B.row|A.nu!=B.nu) /判断A、B的行列数是否相等 printf("error!n"); else C.row=A.row; /把A的行数赋给C C.nu=A.nu; /把A的列数赋给C while(i<=A.tu&&
22、j<=B.tu) if(A.datai.i=B.dataj.i) /如果三元组A的行下标与B的行下标相等 if(A.datai.j<B.dataj.j)/如果三元组A的列下标小于B的行下标 C.datak.i=A.datai.i;/把当前三元组A行下标i插入三元组C C.datak.j=A.datai.j;/把当前三元组A下列标j插入三元组C C.datak.e=A.datai.e;/把当前三元组A下标i对于的数值e插入三元组C k+; i+; else if(A.datai.j>B.dataj.j)/如果三元组A的列下标大于B的行下标 C.datak.i=B.dataj.i
23、; C.datak.j=B.dataj.j; C.datak.e=B.dataj.e; k+; j+; else /如果三元组A的列下标等于B的行下标 v=A.datai.e+B.dataj.e; if(v!=0) C.datak.i=A.datai.i; /把当前三元组A行下标i插入三元组C C.datak.j=A.datai.j; /把当前三元组A下列标j插入三元组C C.datak.e=v; /把三元组A-B下标i对于的数值v插入三元组C k+; i+; j+; else if(A.datai.i<B.dataj.i) /如果三元组A的行下标小于B的行下标 C.datak.i=A.
24、datai.i; /把当前三元组A行下标i插入三元组C C.datak.j=A.datai.j; /把当前三元组A下列标j插入三元组C C.datak.e=A.datai.e; /把当前三元组A下标i对于的数值e插入三元组C k+; i+; else C.datak.i=B.dataj.i;/把当前三元组B下行标i插入三元组C C.datak.j=B.dataj.j;/把当前三元组B下列标j插入三元组C C.datak.e=B.dataj.e;/把当前三元组B下标i对于的数值e插入三元组C k+; j+; while(i<=A.tu) C.datak.i=A.datai.i;/把当前三元
25、组A下行标i插入三元组C C.datak.j=A.datai.j;/把当前三元组A下列标j插入三元组C C.datak.e=A.datai.e;/把当前三元组A下标i对于的数值e插入三元组C k+; i+; while(j<=B.tu) C.datak.i=B.dataj.i;/把当前三元组B下行标i插入三元组C C.datak.j=B.dataj.j;/把当前三元组B下列标j插入三元组C C.datak.e=B.dataj.e;/把当前三元组B下标i对于的数值e插入三元组C k+; j+; C.tu=k-1; void SubMatrix(Matrix A,Matrix B,Matri
26、x &C) C=*(Matrix *)malloc(sizeof(Matrix); int i=1,j=1,k=1; int v; if(A.row!=B.row|A.nu!=B.nu) /判断A、B的行列数是否相等 printf("error!n"); else C.row=A.row; C.nu=A.nu; while(i<=A.tu&&j<=B.tu) if(A.datai.i=B.dataj.i) if(A.datai.j<B.dataj.j) C.datak.i=A.datai.i;/把当前三元组A下行标i插入三元组C C
27、.datak.j=A.datai.j;/把当前三元组A下列标j插入三元组C C.datak.e=A.datai.e;/把当前三元组A下标i对于的数值e插入三元组C k+; i+; else if(A.datai.j>B.dataj.j) C.datak.i=B.dataj.i;/把当前三元组B下行标i插入三元组C C.datak.j=B.dataj.j;/把当前三元组B下列标j插入三元组C C.datak.e=B.dataj.e;/把当前三元组B下标i对于的数值e插入三元组C k+; j+; else v=A.datai.e-B.dataj.e; if(v!=0) C.datak.i=A
28、.datai.i;/把当前三元组A下行标i插入三元组C C.datak.j=A.datai.j;/把当前三元组A下列标j插入三元组C C.datak.e=v; /把三元组A-B下标i对于的数值v插入三元组C k+; i+; j+; else if(A.datai.i<B.dataj.i) C.datak.i=A.datai.i;/把当前三元组A下行标i插入三元组C C.datak.j=A.datai.j;/把当前三元组A下列标j插入三元组C C.datak.e=A.datai.e;/把当前三元组A下标i对于的数值e插入三元组C k+; i+; else C.datak.i=B.dataj
29、.i;/把当前三元组B下行标i插入三元组C C.datak.j=B.dataj.j;/把当前三元组B下列标j插入三元组C C.datak.e=B.dataj.e;/把当前三元组B下标i对于的数值e插入三元组C k+; j+; while(i<=A.tu) C.datak.i=A.datai.i;/把当前三元组A下行标i插入三元组C C.datak.j=A.datai.j;/把当前三元组A下列标j插入三元组C C.datak.e=A.datai.e;/把当前三元组A下标i对于的数值e插入三元组C k+; i+; while(j<=B.tu) C.datak.i=B.dataj.i;/把当前三元组B下行标i插入三元组C C.datak.j=B.dataj.j;/把当前三元组B下列标j插入三元组C C.datak.e=B.dataj.e;/把当前三元组B下标i对于的数值e插入三元组C k+; j+; C.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026湖南长沙联合白金人力资源顾问有限公司外包人员招聘1人农业考试参考题库及答案解析
- 西南医科大学2026年4月公开考核招聘工作人员(40人)农业笔试参考题库及答案解析
- 2026年宣城市泾县招聘司法辅助工作人员1名农业笔试模拟试题及答案解析
- 2026江苏无锡市混合现实应用技术研究所招聘农业笔试备考试题及答案解析
- 2026双鸭山宝清县教育系统公开招聘教师30人农业笔试参考题库及答案解析
- 2026广西防城港市自然资源局所属事业单位编外人员招聘农业考试备考题库及答案解析
- 2026云南普洱市墨江县中医医院招聘3人农业考试模拟试题及答案解析
- 2026榆林市横山区双城卫生院招聘农业笔试备考试题及答案解析
- 2026云南临沧镇康县教育体育系统事业单位急需紧缺专业人才引进9人农业笔试参考题库及答案解析
- 天马微电子股份有限公司2026届春季校园招聘农业考试参考题库及答案解析
- 2026年宁波慈溪市煤气有限公司下属公司公开招聘工作人员4人建设笔试备考试题及答案解析
- 【地理】 欧洲西部第1课时课件-2025-2026学年人教版(2024)七年级地理下学期
- 芜湖市2026公安机关辅警招聘考试笔试题库(含答案)
- 2026苏科版(新教材)初中数学七年级下册期中知识点复习要点梳理(7-9章)
- 2026中国地铁广告行业营销态势及投资盈利预测报告
- 期中考试模拟试卷(含答案) 2025~2026学年度人教版七年级下册地理
- 广东江西稳派智慧上进教育联考2026届高三年级3月二轮复习阶段检测政治+答案
- 采购防欺诈制度
- 2025-2026学年浙美版(新教材)小学美术二年级下册《我爱运动》教学课件
- 制定单位一把手监督制度
- 2025至2030中国短剧内容生产与平台分成机制研究报告
评论
0/150
提交评论