ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:39.74KB ,
资源ID:26191449      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/26191449.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于稀疏矩阵的加法的实现.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于稀疏矩阵的加法的实现.docx

1、基于稀疏矩阵的加法的实现题 目: 基于稀疏矩阵的加法的实现初始条件:理论:学习了数据结构课程,掌握了基本的数据结构和常用的算法;实践:计算机技术系实验室提供计算机及软件开发环境。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1、系统应具备的功能:(1)设计稀疏矩阵的存储结构(2)实现稀疏矩阵的加法(3)输出结果2、数据结构设计;3、主要算法设计;4、编程及上机实现;5、撰写课程设计报告,包括:(1)设计题目;(2)摘要和关键字(中文和英文);(3)正文,包括引言、需求分析、数据结构设计、算法设计、程序实现及测试、不足之处、设计体会等;(4)结束语;(5)参考

2、文献。时间安排: 2007年7月2日7日 (第18周)7月2日 查阅资料7月3日 系统设计,数据结构设计,算法设计7月4日-5日 编程并上机调试7月6日 撰写报告7月7日 验收程序,提交设计报告书。指导教师签名: 2007年7月2日系主任(或责任教师)签名: 2007年7月2日稀疏矩阵相加的实现摘要:该程序实现了对简单矩阵的相加,但是仍存在一些问题未能解决。设计该问题采用了C语言程序设计,简介而方便,它主要运用了建立函数,调用函数,建立递归函数等等方面来进行设计。关键字:稀疏矩阵,十字链表 1. 引言随着社会的不断进步以及数学和计算机科学的发展,矩阵的应用也越来广泛。因而,如何更快的进行矩阵的

3、各项运算也就成为了一项重要的问题,下面的这个程序简单的描述了稀疏矩阵的相加,有利于同学们对矩阵运算的了解。2. 需求分析(1) 构造稀疏矩阵并以三元组顺序表表示,矩阵的合法字符:小写或大写字母、大括弧、顿号、分号,且稀疏矩阵用三元组来表示。(2) 演示程序是以系统为主、用户为辅进行执行的,稀疏矩阵的建立方式是用户事先在程序中建立,计算机系统自行输出显示的,然后分步自行显示每一个操作数据的结果。3. 数据结构设计 在这个程序中运用的存储结构是十字链表,对于十字链表的结构定义如下:typedef struct OLNode int row,col; /*非零元素的行和列下标*/ ElementTy

4、pe value; struct OLNode *right; /*非零元素所在行表、列表的后继链域*/ struct OLNode *down; OLNode; *OLink; typedef struct OLink *row_head; /*行、列链表的头指针向量*/ OLink *col_head; int m,n,len; /*稀疏矩阵的行数、列数、非零元素的个数*/ CrossList;4. 算法设计3.1算法的描述 在这个设计中我运用的是十字链表的存储结构,3.2建立稀疏矩阵十字链表的算法 void CreateCrossList(CrossList *M) /*采用十字链表存储

5、结构,创建稀疏矩阵M*/ scanf(&m,&n,&t); /*输入M的行数,列数和非零元素的个数*/ M-m=m; M-n=n; M-len=t; if(!(M-row_head=(OLink *)malloc(m+1)sizeof(OLink) exit(OVERFLOW); if(!(M-col_head=(OLink * )malloc(n+1)sizeof(OLink) exit(OVERFLOW); M-row_head =M-col_head =NULL; /*初始化行、列头指针向量,各行、列链表为空的链表*/ for(scanf(&i,&j,&e);i!=0;scanf(&i,

6、&j,&e) if(!(p=(OLNode *)malloc(sizeof(OLNode) exit(OVERFLOW); p-row=i; p-col=j; p-value=e; /*生成结点*/ if(M-row_headi=NULL) M-row_headi=p; else 3.2.1寻找行表中的插入位置的算法 for(q=M-row_headi;q-right&q-right-colright); /*空循环体*/ p-right=q-right; q-right=p; /*完成插入*/ if(M-col_headj=NULL) M-col_headj=p; else 3.2.2寻找列

7、表中的插入位置的算法for(q=M-col_headj;q-down&q-down-rowdown); /*空循环体*/ p-down=q-down; q-down=p; /*完成插入*/ 3.3有关技术讨论 这个程序中运用了矩阵的相加运算:创建十字链表,运用十字链表进行稀疏矩阵的加法运算。5. 程序实现4.1 部分模块的实现4.1.1结构类型的定义及十字链表的稀疏矩阵创建的实现/* Note:Your choice is C IDE */ #include #include #define MAXMN 20 typedef struct node int row,col; struct no

8、de *right,*down; union struct node *next; int val; member; matnode; /* 定义结构类型 */ typedef matnode *link; /* 结构的指针 */ void crt_linkedmat(link *hm); /* 创建十字链表的稀疏矩阵的函数 */ void dis_linkedmat(link hm); /* 显示十字链表的稀疏矩阵的函数 */ void initiate(link *hc,int m,int n); void insert(link *hc,link p); /*将指针p插入到以 *hc为头

9、指针的十字链表中*/ link add(link ha,link hb);4.1.2十字链表的创建及初始化的实现 int main() link ha,hb,hc;ha=NULL;hb=NULL;hc=NULL; /*初始化指针ha,hb,hc */crt_linkedmat(&ha);/*创建以ha为头指针的十字链表 */dis_linkedmat(ha); /*将以ha为头指针的十字链表的稀疏矩阵显出来*/getch(); /* 控制符 */crt_linkedmat(&hb); /* 同理创建以hb为头指针的十字链表 */dis_linkedmat(hb);getch();hc=add(

10、ha,hb);/* 矩阵加法,结果返回到hc中 */if(hc=NULL)printf(The sparse matrixes cannot add!n);else dis_linkedmat(hc);getch();return 0; 4.1.3数据输入的实现 void crt_linkedmat(link *hm) int m,n,tu,s,k; int i,j,v; link cpMAXMN; link p,q; printf(Please input the matrixs row,col,& tu:n); /* 输入矩阵的行数,列数,和非零的值的个数 */ scanf(%d %d %

11、d,&m,&n,&tu); if(m=n) s=m; else s=n; p=(link)malloc(sizeof(matnode); p-row=m;p-col=n; *hm=p;cp0=p; for(k=1;krow=0;p-col=0; p-right=p;p-down=p; cpk=p; cpk-1-member.next=p; cps-member.next=(*hm); for(k=1;krow=i;p-col=j;p-member.val=v; q=cpi; /* 插入到行链中 */ while(q-right!=cpi)&(q-right-colright; p-right=

12、q-right; q-right=p; q=cpj; /* 插入到列链中 */ while(q-down!=cpj)&(q-down-rowdown; p-down=q-down; q-down=p; 4.1.4十字链表的稀疏矩阵显示的实现 void dis_linkedmat(link hm) int m,n,i; link cpMAXMN; link p; m=hm-row; n=hm-col; if(nm) m=n; cp0=hm; for(i=1;imember.next; for(m=1;mrow;+m) for(n=1;ncol;+n) p=cpm-right; while(p!=

13、cpm)&(p-colright; if(p!=cpm)&(p-col=n) printf( %d ,p-member.val); else printf( 0 ); printf(n); 4.1.5 初始化及创建循环链表的实现初始化以*hc为头指针的十字链表,m为矩阵行数,n为矩阵的列数。并初始化头节点指针,创建成头节点循环链表。void initiate(link *hc,int m,int n) link cpMAXMN,p; int s,k; p=(link)malloc(sizeof(matnode); p-row=m;p-col=n; *hc=p;cp0=p; s=mn?m:n;

14、for(k=1;krow=0;p-col=0; p-right=p;p-down=p; cpk=p; cpk-1-member.next=p; cps-member.next=(*hc); 4.1.6 指针插入十字链表的实现将指针p插入到以*hc为头指针的十字链表中。 void insert(link *hc,link p) int m,n,i; link cpMAXMN,q; m=(*hc)-row;n=(*hc)-col; if(nm) m=n; cp0=(*hc); for(i=1;imember.next; m=p-row;n=p-col; q=cpm; /* 插入到行链中 */ wh

15、ile(q-right!=cpm)&(q-right-colright; p-right=q-right; q-right=p; q=cpn; /* 插入到列链中 */ while(q-down!=cpn)&(q-down-rowdown; p-down=q-down; q-down=p; 4.1.7 矩阵加法的实现矩阵的加法函数,返回结果的头指针hc 。 link add(link ha,link hb) link hc,ca,cb,pa,pb,p; int m,n,val,flag; hc=NULL; if(ha-row!=hb-row)|(ha-col!=hb-col) /* 判断是否具

16、备相加的条件 */ return hc; /*不能相加返回NULL */ else m=ha-row;n=ha-col; /* 行值m和列值n */ initiate(&hc,m,n); /* 初始化hc */ ca=ha-member.next;cb=hb-member.next; /* ca和cb分别为第一个头节点,即是第一行链的头节点*/ while(ca!=ha)&(cb!=hb) /* 当行链值都不等于头指针ha和hb */ pa=ca-right;pb=cb-right; /* 分别指向行链中的第一个元素节点 */ while(pa!=ca)&(pb!=cb) if(pa-colc

17、ol) /* 比较列值,如果pa的列值小的话,标志为1 */ flag=1; if(pa-colpb-col) /* 同理,pb的列值小的话,标志为2 */ flag=2; if(pa-col=pb-col) /* 相等时 ,标志为3 */ flag=3; switch(flag) case 1: insert(&hc,pa);/* 为1时,插入pa */ pa=pa-right;/* 使pa向后移一个节点 */ break; case 2: insert(&hc,pb); /* 为2时,插入pb */ pb=pb-right; /* 使pb向后移一个节点 */ break; case 3:

18、val=pa-member.val+pb-member.val; /* 为3时,值相加 */ if(val) /* 若不为0,则申请一个节点,并将这节点插入到hc */ p=(link)malloc(sizeof(matnode); p-row=pa-row;p-col=pa-col; p-member.val=val; insert(&hc,p); break; while(pa!=ca)&(pb=cb)/* pa还没回到头节点,pb已是头节点时 */ insert(&hc,pa); pa=pa-right; while(pa=ca)&(pb!=cb) /* pa回到头节点,pb还没回到 *

19、/ insert(&hc,pb); pb=pb-right; ca=ca-member.next;cb=cb-member.next; /* 继续处理下一行 */ return hc; 4.2 运行结果 4.2.1 运行界面 4.2.2输入矩阵的行列数以及非零元素的个数 4.2.3 输入具体数据及输出6. 设计体会 做程序是一个比较累的工作,特别是当遇到困难时,程序通不过时,真的很令人沮丧。但是改正一个错误时,那种喜悦心情也很令人期盼,这种心情堪比久旱见甘霖的喜悦。就是因为有这种令人身心愉悦的可能,我才得以能够整晚不睡来改程序中的不足之处。编程中有苦有乐,其中的苦乐只有亲身经历才能体会到。要想

20、做出好的程序,必须做好忍受其间痛苦的准备。通过这个星期的课程设计,我的收获还是不少。我的c语言水平有了比较大的提高,其中c语言关于指针,链表的操作理解的比以前深刻不少。另外是数据结构方面的提高,对存储结构,及各种查找排序方面也有不少的提高。虽然我做的程序里还有写问题,做的不够深入,但独立完成一个比较大一点的程序的经历也是很宝贵的。7. 结束语 C语言功能强,使用灵活, 可移植性好,目标程序质量好,它既有高级语言的优点,又具有低级语言的许多特点,既可以用来编写系统软件,又可以编写应用软件,由于c语言语法限制不严格,程序设计自由度大,在使用时会出现一些”副作用”,所以学好c语言最好有过学习一门其他

21、语言. 在编程过程中善于发现程序中的错误,并且能很快地排除这些错误,使程序能正确运行。经验丰富的人,当编译时出现“出错信息”时,能很快地判断出错误所在,并改正之。而缺乏经验的人即使在明确的出错提示下也往往找不出错误而求救于别人。调试程序的经验固然可以借鉴他人的现成经验,但更重要的是通过自己的直接实践来累积,而且有些经验是只能“会意”难以“言传”。因此,在实验时千万不要在程序通过后就认为万事大吉、完成任务了,而应当在已通过的程序基础上作一些改动(例如修改一些参数、增加程序一些功能、改变输入数据的方法等),再进行编译、连接和运行。参考文献1 严蔚敏,吴伟民.数据结构,清华大学出版社,2001年1月2 张颖江,胡燕.C语言程序设计,科学出版社,1998年7月3 谭浩强.C程序设计,清华大学出版社,1999年12月

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1