数据结构课程设计 报告(十字链表实现稀疏矩阵的加法)_第1页
数据结构课程设计 报告(十字链表实现稀疏矩阵的加法)_第2页
数据结构课程设计 报告(十字链表实现稀疏矩阵的加法)_第3页
数据结构课程设计 报告(十字链表实现稀疏矩阵的加法)_第4页
数据结构课程设计 报告(十字链表实现稀疏矩阵的加法)_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论