十字链表实现稀疏矩阵的加法_第1页
十字链表实现稀疏矩阵的加法_第2页
十字链表实现稀疏矩阵的加法_第3页
十字链表实现稀疏矩阵的加法_第4页
十字链表实现稀疏矩阵的加法_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、实验二 十字链表 一、实验题目 以十字链表为储存结构,实现稀疏矩阵的求和运算。 二、问题描述1、 功能要求:根据用户输入的矩阵,实现稀疏矩阵的求和运算,并输出结果。2、 输入要求:矩阵的数据在程序运行的时候由用户提供,先由用户输入稀疏矩阵的行数、列数和非零元个数。再根据非零元个数,输入这些非零元,还需要用户为这些非零元输入行、列和非零元的值。这样,一个稀疏矩阵就输入完成。 若输入3 3 2 则表示这个稀疏矩阵有3行3列2个非零元 然后用户需要为这两个非零元输入行、列、非零元的值 如:1 1 22 2 1 表示第一个非零元行为1,列为1,,值为2;第二个非零元行为2,列为2,值为1。 此过程输入

2、的稀疏矩阵为: 2 0 0 0 1 0 0 0 03、 输出要求:输出按矩阵输出,按行列依次输出,非零元则输出非零元的值,不是非零元则输出“0”。各元素之间用空格隔开。最后输出完整的矩阵。 三、概要设计1稀疏矩阵的抽象数据类型定义如下:adt sparsematrix 数据对象: d=aij|i=1,2,3m,j=1,2,3n; aij属于elemset,m和n分别是稀疏矩阵的行数和列数数据关系: r= row, col row=<aij,aij+1>|1<=i<=m,1<=j<=n-1col=<aij,ai+1j>|1<=i<=m-

3、1,1<=j<=n基本操作:createsmatrix(&m);/建立稀疏矩阵mdestroysmatrix(&m);/销毁稀疏矩阵m;transposesmatrix(m);/求稀疏矩阵的转置矩阵addsmatrix(&m,&n);/求稀疏矩阵m和n之和mulsmatrix(&m,&n);/求稀疏矩阵m和n之积adt sparsematrix2、 存储结构选择采用十字链表存储稀疏矩阵,它是稀疏矩阵链式表示的一种较好的表示方法。在十字链表中,每一个非零矩阵元素存储在一个结点内。每一个节点除了存储非零元素的三元组以外,还设置了right

4、和down两个指针,分别指向同一行的下一个非零元素结点和同一列的下一个非零元结点。3、 其他函数1) 主函数main()2) 作为友元函数的加法运算。4、 详细设计用十字链表表示稀疏矩阵,需要定义结点类和链表类两个类1、 结点类matrixnodetemplate<class type>class matrixnode friend class linkmatrix<type>friend istream&operator>>(istream&,linkmatrix<type>&); friend ostream&

5、operator<<(ostream&out, linkmatrix<type>&); friend linkmatrix<type> operator +(const linkmatrix<type> &a,const linkmatrix<type> &b);private:int row,col;matrixnode<type>*right,*down;uniontype data;matrixnode<type>*next;2、 链表类template<class

6、type>class linkmatrixprivate:matrixnode<type> *head;void insertincol(matrixnode<type>*p);void deleteincol(matrixnode<type>*p);public:friend istream&operator>>(istream&in,linkmatrix<type>&);friend ostream&operator<<(ostream&out,linkmatrix<

7、type>&);matrixnode<type>* head(int i);linkmatrix<type>&operator +=(const linkmatrix<type> &a);friend linkmatrix<type> operator +(const linkmatrix<type> &a,const linkmatrix<type> &b); ;3、 求头结点函数template<class type> matrixnode<type>

8、;* linkmatrix<type>:head(int i) matrixnode<type>*a;a=head->next;for(int j=1;j<i;j+)a=a->next; return a;4、 将结点p插入p->col列中template<class type>void linkmatrix<type>:insertincol(matrixnode<type>*p)matrixnode<type>*pre,*ch=head(p->col);pre=ch;while(pre-&

9、gt;down!=ch&&pre->down->row<p->row)pre=pre->down;p->down=pre->down;pre->down=p;5、 在p->col列中删除结点p,并释放空间template<class type>void linkmatrix<type>:deleteincol(matrixnode<type>*p)matrixnode<type>*pre,*ch=head(p->col);pre=ch;while(pre->down

10、!=ch&&pre->down!=p)pre=pre->down;if(pre->down=p)pre->down=p->down;delete p;6、 重载>>函数template<class type>istream&operator>>(istream&in,linkmatrix<type>&a)int m,n,terms,s;matrixnode<type>*cp,*p,*q;cout<<"输入矩阵的行数、列数、和非零元素个数&quo

11、t;<<endl;in>>m>>n>>terms;if(n>m)s=n;else s=m;a.head=new matrixnode<type>a.head->row=m;a.head->col=n;a.head->right=a.head->down=null;cp=new matrixnode<type>*s+1;cp0=a.head;int i;for(i=1;i<=s;i+)p=new matrixnode<type>p->row=p->col=0;p-&

12、gt;right=p->down=p;cpi=p;cpi-1->next=p;cps->next=a.head;for(i=1;i<=terms;i+)cout<<"输入一个非零元三元组(row,col,value)"<<endl;p=new matrixnode<type>in>>p->row>>p->col>>p->data;q=cpp->row;while(q->right!=cpp->row&&(q->right-

13、>col<p->col)q=q->right;p->right=q->right;q->right=p;q=cpp->col;while(q->down!=cpp->row&&(q->down->col<p->col)q=q->down;p->down=q->down;q->down=p;deletecp;return in;7、 重载<<函数template<class type>ostream & operator<<(os

14、tream & out ,linkmatrix<type>& a)for(int i=1;i<=a.head->row;i+)matrixnode<type>*b=a.head(i);b=b->right;for(int j=1;j<=a.head->col;j+)if(b->row=i&&b->col=j)cout<<b->data<<' 'b=b->right;elsecout<<'0'<<'

15、'cout<<endl;return out; 8、 重载+=实现求和函数template<class type> /重载符合赋值运算符+=linkmatrix<type>&linkmatrix<type>:operator +=(const linkmatrix<type> &a)matrixnode<type> *pre,*pa,*h,*ah,*p,*tmp;if(head->col !=a.head->col|head->row !=a.head->row)/非同型矩阵

16、不可相加cout<<"the two matrice aren't isomorphic!"/throw domain_error("the two matrice aren't isomorphic!");h=head->next;ah=a.head->next; /h、ah指向当前处理行的头结点while(h !=head) /逐一处理各行pre=h; p=h->right; /p指向被加矩阵的当前结点,pre指向其前驱pa=ah->right; /pa分别指向加矩阵的当前结点while(pa !=

17、ah) /处理当前行if(p !=h&&(p->col<pa->col) /若被加矩阵的列标更小,则比较下一个pre=p; p=p->right;else if(p=h|p->col>pa->col) tmp=new matrixnode<type>(*pa) ;pre->right=tmp; /在行链表中插入pa复制结点tmptmp->right=p;insertincol(tmp); /在列表中插入tmppre=tmp; /当前指针p的前驱变为tmppa=pa->right;else /列标相同,则做加

18、法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<class type> /重载加法运算符+linkmatrix<type> operator +(

19、const linkmatrix<type> &a,const linkmatrix<type> &b)linkmatrix<type> c(a); /复制构造函数得到被加矩阵a的一个副本放在矩阵c中c+=b;return c;5、 调试与测试1、 编译环境visual c+ 6.02、 main函数int main()linkmatrix<int>a,b,c;cin>>a;cout<<"a矩阵为:n"<<a<<endl;cin>>b;cout<

20、<"b矩阵为:n"<<b<<endl;c=a+b;cout<<"a+b=n"<<c<<endl;system("pause");return 0;3、 具体步骤按f5编译,界面出现提示“请输入行数、列数、非零元个数”。输入3 3 3表示这个矩阵行数为3,列数为3,非零元个数为3,接着提示“请输入一个非零元三元组<row,col,value>”。输入1 1 1表示第一个三元组的行为1,列为1,值为1然后程序继续提示“输入一个非零元三元组<row,col,

21、value>”。按要求再依次输入2 2 23 1 5则矩阵a输入完成,程序按矩阵格式输出矩阵a程序继续提示“请输入行数、列数、非零元个数”在按上述操作继续输入3 3 41 1 22 1 13 1 13 3 3为矩阵b输入,完成后程序输入矩阵b程序同时输出a+b3、 结果分析程序提供输入和输出,根据输入的矩阵a和矩阵b,a+b计算结果准确无误。6、 使用说明使用本程序简单明了,只需根据提示为稀疏矩阵输入,就可以计算出稀疏矩阵的和。附录2: 十字链表实现稀疏矩阵相加源程序 软件2班 201113040207#include<iostream>using namespace std

22、;template<class type>class matrixnode; template<class type>class linkmatrix;template<class type>istream &operator>>(istream &,linkmatrix<type>&);template<class type>ostream &operator<<(ostream &,linkmatrix<type>&);template<cl

23、ass type>linkmatrix<type> operator +(const linkmatrix<type> &a,const linkmatrix<type> &b);template<class type>class matrixnode friend class linkmatrix<type>friend istream&operator>>(istream&,linkmatrix<type>&); friend ostream&opera

24、tor<<(ostream&out, linkmatrix<type>&); friend linkmatrix<type> operator +(const linkmatrix<type> &a,const linkmatrix<type> &b);private:int row,col;matrixnode<type>*right,*down;uniontype data;matrixnode<type>*next;template<class type>cla

25、ss linkmatrixprivate:matrixnode<type> *head;void insertincol(matrixnode<type>*p);void deleteincol(matrixnode<type>*p);public:friend istream&operator>>(istream&in,linkmatrix<type>&);friend ostream&operator<<(ostream&out,linkmatrix<type>&am

26、p;);matrixnode<type>* head(int i);linkmatrix<type>&operator +=(const linkmatrix<type> &a);friend linkmatrix<type> operator +(const linkmatrix<type> &a,const linkmatrix<type> &b); ;int main()linkmatrix<int>a,b,c;cin>>a;cout<<"

27、a矩阵为:n"<<a<<endl;cin>>b;cout<<"b矩阵为:n"<<b<<endl;c=a+b;cout<<"a+b=n"<<c<<endl;system("pause");return 0;template<class type>istream&operator>>(istream&in,linkmatrix<type>&a)int m,n,te

28、rms,s;matrixnode<type>*cp,*p,*q;cout<<"输入矩阵的行数、列数、和非零元素个数"<<endl;in>>m>>n>>terms;if(n>m)s=n;else s=m;a.head=new matrixnode<type>a.head->row=m;a.head->col=n;a.head->right=a.head->down=null;cp=new matrixnode<type>*s+1;cp0=a.head;

29、int i;for(i=1;i<=s;i+)p=new matrixnode<type>p->row=p->col=0;p->right=p->down=p;cpi=p;cpi-1->next=p;cps->next=a.head;for(i=1;i<=terms;i+)cout<<"输入一个非零元三元组(row,col,value)"<<endl;p=new matrixnode<type>in>>p->row>>p->col>>

30、p->data;q=cpp->row;while(q->right!=cpp->row&&(q->right->col<p->col)q=q->right;p->right=q->right;q->right=p;q=cpp->col;while(q->down!=cpp->row&&(q->down->col<p->col)q=q->down;p->down=q->down;q->down=p;deletecp;return

31、 in;template<class type> matrixnode<type>* linkmatrix<type>:head(int i) matrixnode<type>*a;a=head->next;for(int j=1;j<i;j+)a=a->next; return a;template<class type>void linkmatrix<type>:insertincol(matrixnode<type>*p)matrixnode<type>*pre,*ch=he

32、ad(p->col);pre=ch;while(pre->down!=ch&&pre->down->row<p->row)pre=pre->down;p->down=pre->down;pre->down=p;template<class type>void linkmatrix<type>:deleteincol(matrixnode<type>*p)matrixnode<type>*pre,*ch=head(p->col);pre=ch;while(pre-&g

33、t;down!=ch&&pre->down!=p)pre=pre->down;if(pre->down=p)pre->down=p->down;delete p;/else throw invalid_arguement("no such a node to be deleted in deleteincol()");template<class type> /重载符合赋值运算符+=linkmatrix<type>&linkmatrix<type>:operator +=(const

34、linkmatrix<type> &a)matrixnode<type> *pre,*pa,*h,*ah,*p,*tmp;if(head->col !=a.head->col|head->row !=a.head->row)/非同型矩阵不可相加cout<<"the two matrice aren't isomorphic!"/throw domain_error("the two matrice aren't isomorphic!");h=head->next;ah=a.head->next; /h、ah指向当前处理行的头结点while(h !=head) /逐一处理各行pre=h; p=h->right; /p指向被加矩阵的当前结点,pre指向其前驱pa=ah->right; /pa分别指向加矩阵的当前结点whi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论