数据结构_数组与广义表_矩阵的十字链表存储稀疏矩阵相加
2011-10-24 23:55
579 查看
十字链表做存储结构实现矩阵相加,这个功能简单的程序调试了N久,数度想放弃,但想想还是想坚持了下来,指针跳来跳去的快把我跳晕了,各种细节,比如删除节点后要修改相应节点的指针以确保能正常输出。终于调通了,一道坎总算过去了,示例通过后连加注释的勇气都没了。算了,先贴出来吧。
"crosslist.h"
"main.cpp"
"crosslist.h"
#include<iostream> using namespace std; #define ElemType int #define MAX_MATRIX_SIZE 20 class OLNode { public: OLNode(); int i,j; ElemType e; OLNode* down,*right; }; OLNode::OLNode() { down=right=NULL; } class CrossList { public: CrossList(); OLNode *lhead[MAX_MATRIX_SIZE+1]; OLNode *uhead[MAX_MATRIX_SIZE+1]; int mu,nu,tu; }; CrossList::CrossList() { for(int i=0;i<MAX_MATRIX_SIZE;i++) lhead[i]=uhead[i]=NULL; mu=nu=tu=0; } class Matrix { public: void MatrixPlus();//接口函数 private: void GetMatrix(CrossList &);//得到三元组矩阵并将其链接成十字链表 void PrintMatrix(CrossList &);//打印三元组矩阵 void Plus(CrossList &,CrossList &);//在十字链表上实现矩阵相加 }; void Matrix::MatrixPlus()//接口函数 { CrossList m,n; GetMatrix(m);//得到三元组矩阵并将其链接成十字链表 GetMatrix(n);//得到三元组矩阵并将其链接成十字链表 PrintMatrix(m);//打印三元组矩阵 PrintMatrix(n);//打印三元组矩阵 Plus(m,n);//在十字链表上实现矩阵相加 PrintMatrix(m);//打印三元组矩阵 } void Matrix::GetMatrix(CrossList &t)//得到三元组矩阵并将其链接成十字链表 { cout<<"Please Input The Size Of The Matrix(m*n)"<<endl; cin>>t.mu>>t.nu; cout<<"Please Input Matrix With Increasing Order Of RowNumber"<<endl <<"rownum columnnum element"<<endl<<endl; int i,j; ElemType e; OLNode *newnode,*p,*keep; while(cin>>i>>j>>e) { if(e!=0)//元素不为0 { newnode=new OLNode; newnode->i=i; newnode->j=j; newnode->e=e; if((p=t.lhead[i])==NULL)//左连 t.lhead[i]=newnode; else { while(p->right!=NULL&&p->right->right->j<j) p=p->right; if(p->right==NULL) p->right=newnode; else { keep=p->right->right; p->right=newnode; newnode->right=keep; } } if((p=t.uhead[j])==NULL)//上连 t.uhead[j]=newnode; else { while(p->down!=NULL&&p->down->down->j<j) p=p->down; if(p->down==NULL) p->down=newnode; else { keep=p->down->down; p->down=newnode; newnode->down=keep; } } t.tu++; } } cin.clear(); } void Matrix::Plus(CrossList &m,CrossList &n)//在十字链表上实现矩阵相加 { OLNode *pm,*pn,*pre,*insert,*keep,*hl[MAX_MATRIX_SIZE]; for(int i=1;i<=m.mu;i++)//遍历从所有行 { pm=m.lhead[i]; pn=n.lhead[i]; pre=NULL; for(int j=0;j<MAX_MATRIX_SIZE;j++) hl[j]=m.uhead[j]; while(pn!=NULL) { //横插 if(pm==NULL||pm->j>pn->j) { //new a copynode insert=new OLNode; insert->i=pn->i; insert->j=pn->j; insert->e=pn->e; //insert if(pre==NULL) m.lhead[i]=insert; else pre->right=insert; insert->right=pm; pre=insert; //竖插 if(m.uhead[insert->j]==NULL||m.uhead[insert->j]->i>insert->i) { insert->down=m.uhead[insert->j]; m.uhead[insert->j]=insert; } else { insert->down=hl[insert->j]->down; hl[insert->j]->down=insert; } hl[insert->j]=insert; pn=pn->right; } else if(pm->j==pn->j) { pm->e+=pn->e; if(pm->e==0) { keep=pm; if(pre==NULL) { m.lhead[pm->i]=pm->right; } else { pre->right=pm->right; pre=pm; } pm=pm->right; delete keep; } pn=pn->right; } else { pre=pm; pm=pm->right; } } } } void Matrix::PrintMatrix(CrossList &t)//打印三元组矩阵 { OLNode *p; for(int i=1;i<=t.mu;i++) { p=t.lhead[i]; while(p!=NULL) { cout<<p->i<<" "<<p->j<<" "<<p->e<<endl; p=p->right; } } cout<<endl; }
"main.cpp"
#include"crosslist.h" int main() { Matrix M; M.MatrixPlus(); system("pause"); }
相关文章推荐
- javascript实现数据结构:稀疏矩阵的十字链表存储表示
- 第九周 数据结构实践项目——数组和广义表【项目3.2-- 稀疏矩阵相加】
- 数据结构:稀疏矩阵的十字链表存储
- c语言版数据结构(奇迹冬瓜)-数组和广义表(十字链表存贮稀疏矩阵的行列值)
- 稀疏矩阵的十字链表存储表示
- 稀疏矩阵的十字链表存储
- 数据结构Java实现——④数组——>稀疏矩阵三元组顺序存储
- 2015年大二上-数据结构-数组与广义表(3)-2.稀疏矩阵的三元组表示
- 稀疏矩阵的十字链表存储
- 稀疏矩阵的十字链表存储
- 5-3-行逻辑链接的顺序表(稀疏矩阵)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版
- 数据结构--数组和广义表--以三元组顺序表存储方式的矩阵的一般转置和快速转置
- 数组与广义表_稀疏矩阵的压缩存储_三元组做存储结构_矩阵转置
- c语言版数据结构(奇迹冬瓜)-数组和广义表(稀疏矩阵的转置算法一)
- 稀疏矩阵的十字链表存储
- 数组与广义表_稀疏矩阵的压缩存储_三元组做存储结构_矩阵相乘
- 数据结构Java实现——④数组—>稀疏矩阵三元组顺序存储-->矩阵的倒置
- 第九周 数据结构实践项目——数组和广义表【项目3.1-稀疏矩阵的三元组表示的实现及应用】
- 数据结构--数组和广义表--以行逻辑链接的顺序表为存储结构的矩阵的基本运算(求矩阵乘积)
- 矩阵的压缩存储(稀疏矩阵的十字链表存储、稀疏矩阵的三元组行逻辑链接的顺序表存储表示、稀疏矩阵的三元组顺序表存储表示)