您的位置:首页 > 理论基础 > 数据结构算法

数据结构_数组与广义表_矩阵的十字链表存储稀疏矩阵相加

2011-10-24 23:55 579 查看
十字链表做存储结构实现矩阵相加,这个功能简单的程序调试了N久,数度想放弃,但想想还是想坚持了下来,指针跳来跳去的快把我跳晕了,各种细节,比如删除节点后要修改相应节点的指针以确保能正常输出。终于调通了,一道坎总算过去了,示例通过后连加注释的勇气都没了。算了,先贴出来吧。

"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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐