




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文格式为Word版,下载可任意编辑——数据结构课程设计报告(十字链表实现稀疏矩阵的加法)
一、问题描述
十字链表实现稀疏矩阵的加法
1、功能要求:根据用户输入的矩阵,实现稀疏矩阵的求和运算,并输出结果。
2、输入要求:矩阵的数据在程序运行的时候由用户提供,先由用户输入稀疏矩阵的行数、列数和非零元个数。再根据非零元个数,输入这些非零元,还需要用户为这些非零元输入行、列和非零元的值。这样,一个稀疏矩阵就输入完成。若输入
432
则表示这个稀疏矩阵有4行3列2个非零元
然后用户需要为这两个非零元输入行、列、非零元的值如:
122411
表示第一个非零元行为1,列为2,,值为2;其次个非零元行为4,列为1,值为1。此过程输入的稀疏矩阵为:
020000000100
3、输出要求:输出按矩阵输出,按行列依次输出,非零元则输出非零元的值,不是非零元则输出“0〞。各元素之间用空格隔开。最终输出完整的矩阵。
二、概要设计
1.稀疏矩阵的抽象数据类型定义如下:??ADTSparseMatrix{??
数据对象:??D={aij|i=1,2,3??m,j=1,2,3??n;aij属于ElemSet,m和n分别是稀疏矩阵的行数和列数}数据关系:??R={Row,Col}Row={|1classMatrixNode{
friendclassLinkMatrix;friendistreamfriendostream
friendLinkMatrixoperator+(constLinkMatrixprivate:introw,col;MatrixNode*right,*down;union{Typedata;MatrixNode*next;};};
2、链表类
templateclassLinkMatrix{private:MatrixNode*head;voidInsertInCol(MatrixNode*p);voidDeleteInCol(MatrixNode*p);public:
friendistreamfriendostreamMatrixNode*Head(inti);LinkMatrixfriendLinkMatrixoperator+(constLinkMatrix};
3、求头结点函数
templateMatrixNode*LinkMatrix::Head(inti){
MatrixNode*a;a=head->next;for(intj=1;jnext;}returna;}
4、将结点p插入p->col列中
templatevoidLinkMatrix::InsertInCol(MatrixNode*p){MatrixNode*pre,*ch=Head(p->col);pre=ch;while(pre->down!=chp->down=pre->down;pre->down=p;}
5、在p->col列中删除结点p,并释放空间
templatevoidLinkMatrix::DeleteInCol(MatrixNode*p){MatrixNode*pre,*ch=Head(p->col);pre=ch;while(pre->down!=chif(pre->down==p){pre->down=p->down;deletep;}}
6、重载>>函数
templateistreamMatrixNode**cp,*p,*q;cout>m>>n>>terms;if(n>m)s=n;elses=m;a.head=newMatrixNode;a.head->row=m;a.head->col=n;a.head->right=a.head->down=NULL;cp=newMatrixNode*[s+1];cp[0]=a.head;inti;for(i=1;i;p->row=p->col=0;p->right=p->down=p;cp[i]=p;cp[i-1]->next=p;}cp[s]->next=a.head;for(i=1;i;in>>p->row>>p->col>>p->data;q=cp[p->row];while((q->right!=cp[p->row]p->right=q->right;q->right=p;q=cp[p->col];while((q->down!=cp[p->row]p->down=q->down;q->down=p;}delete[]cp;returnin;}
7、重载
ostreamirow;i++){MatrixNode*b=a.Head(i);b=b->right;for(intj=1;jcol;j++){if(b->row==ib=b->right;}else{cout//重载符合赋值运算符+=
LinkMatrix
if(head->col!=a.head->col||head->row!=a.head->row)//非同型矩阵不可相加coutnext;ah=a.head->next;//h、ah指向当前处理行的头结点while(h!=head){//逐一处理各行
pre=h;p=h->right;//p指向被加矩阵的当前结点,pre指向其前驱pa=ah->right;//pa分别指向加矩阵的当前结点while(pa!=ah){//处理当前行
if(p!=hp=p->right;}
elseif(p==h||p->col>pa->col){tmp=newMatrixNode(*pa);
pre->right=tmp;//在行链表中插入pa复制结点tmp
tmp->right=p;
InsertInCol(tmp);//在列表中插入tmppre=tmp;//当前指针p的前驱变为tmppa=pa->right;}
else{//列标一致,则做加法p->data+=pa->data;
if(!p->data){//和为0,则删除之(行、列都要删除)tmp=p;p=p->right;pre->right=p;//在行链表中将tmp摘下DeleteInCol(tmp);//在列链表中将tmp删除}
pre=p;p=p->right;pa=pa->right;}}
h=h->next;ah=ah->next;//处理下一行}
return*this;}
9、重载+
template//重载加法运算符+
LinkMatrixoperator+(constLinkMatrix//复制构造函数得到被加矩阵A的一个副本放在矩阵C中c+=b;returnc;}
五、测试与探讨1、编译环境VisualC++6.02、main函数intmain(){LinkMatrixa,b,c;cin>>a;cout>b;cout〞。
输入
111
表示第一个三元组的行为1,列为1,值为1
然后程序继续提醒“输入一个非零元三元组〞。
按要求再依次输入222315
则矩阵A输入完成,程序按矩阵格式输出矩阵A
程序继续提醒“请输入行数、列数、非零元个数〞在按上述操作继续输入334112211311333
为矩阵B输入,完成后程序输入矩阵B程序同时输出A+B
3、结果分析
程序提供输入和输出,根据输入的矩阵A和矩阵B,A+B计算结果确凿无误。
六、用户手册
使用本程序简单明白,只需根据提醒为稀疏矩阵输入,就可以计算出稀疏矩阵的和。
附录:源代码
(只含pro1.cpp):
//pro1.cpp
#includeusingnamespacestd;
templateclassMatrixNode;templateclassLinkMatrix;
templateistreamtemplateostream
templateLinkMatrixoperator+(constLinkMatrix
templateclassMatrixNode{
friendclassLinkMatrix;friendistreamfriendostream
friendLinkMatrixoperator+(constLinkMatrixprivate:introw,col;MatrixNode*right,*down;union{Typedata;MatrixNode*next;};};
templateclassLinkMatrix{private:MatrixNode*head;voidInsertInCol(MatrixNode*p);voidDeleteInCol(MatrixNode*p);public:friendistreamfriendostreamMatrixNode*Head(inti);LinkMatrix
friendLinkMatrixoperator+(constLinkMatrix};
templateistreamMatrixNode**cp,*p,*q;cout>m>>n>>terms;if(n>m)s=n;elses=m;a.head=newMatrixNode;a.head->row=m;a.head->col=n;a.head->right=a.head->down=NULL;cp=newMatrixNode*[s+1];cp[0]=a.head;inti;for(i=1;i;p->row=p->col=0;p->right=p->down=p;cp[i]=p;cp[i-1]->next=p;}cp[s]->next=a.head;for(i=1;i;in>>p->row>>p->col>>p->data;q=cp[p->row];while((q->right!=cp[p->row]p->right=q->right;q->right=p;q=cp[p->col];while((q->down!=cp[p->row]p->down=q->down;q->down=p;}delete[]cp;returnin;
}
templateMatrixNode*LinkMatrix::Head(inti){
MatrixNode*a;a=head->next;for(intj=1;jnext;}returna;}
templatevoidLinkMatrix::InsertInCol(MatrixNode*p){MatrixNode*pre,*ch=Head(p->col);pre=ch;while(pre->down!=chp->down=pre->down;pre->down=p;}
templatevoidLinkMatrix::DeleteInCol(MatrixNode*p){MatrixNode*pre,*ch=Head(p->col);pre=ch;while(pre->down!=chif(pre->down==p){pre->down=p->down;deletep;}//elsethrowinvalid_arguement(\}
template//重载符合赋值运算符+=
LinkMatrixif(head->col!=a.head->col||head->row!=a.head->row)//非同型矩阵不可相加coutnext;ah=a.head->next;//h、ah指向当前处理行的头结点while(h!=head){//逐一处理各行pre=h;p=h->right;//p指向被加矩阵的当前结点,pre指向其前驱pa=ah->right;//pa分别指向加矩阵的当前结点while(pa!=ah){//处理当前行if(p!=hp=p->right;}elseif(p==h||p->col>pa->col){//若加矩阵的列标更小,则插入tmp=newMatrixNode(*pa);pre->right=tmp;//在行链表中插入pa复制结点tm
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T-ZSA 271-2024 高强度高弹性高导电率钛铜合金
- 二零二五年度私募股权基金股权转让及代持管理协议
- 二零二五年度农副产品电商平台用户增长合作合同
- 二零二五年度体育场馆委托代理出租服务合同
- 二零二五年度海洋工程电焊工劳动合同(海洋平台焊接)
- 二零二五年度临时工兼职合同
- 二零二五年度全屋定制家居装修合同
- 二零二五年度科研实验室租赁合同转让及设备维护协议
- 二零二五年度音乐节现场安全员聘请合同
- 二零二五年度乡村民宿房东与游客租赁合同
- 教学课件 211和985工程大学简介
- 最新地铁通信系统首件定标筹划
- 实木家具生产标准工艺标准流程
- 热导检测器(TCD)原理与操作注意事项
- DB33_T 2352-2021乡镇运输服务站设置规范(可复制)
- 专升本高等数学的讲义80页PPT课件
- 血气分析临床基础(课堂PPT)
- 特种设备停用报废注销申请表
- 糖尿病酮症酸中毒ppt课件
- 五年级下册英语课件--Lesson--7《Arriving-in-Beijing-》|冀教版-(三起)-(共21张PPT)
- 武发[2004]13关于积极推进“ 城中村”综合改造工作的意见
评论
0/150
提交评论