十字链表实现及相加代码如下:
#include <iostream>
#include "malloc.h"
#include "stdlib.h"
using namespace std;
#define OVERFLOW 0
#define OK 1
typedef struct OLNode
{
int i,j; //该非零元的行和列下标
int e;
struct OLNode * right, * down; //该非零元所在行表和列表的后继链域
}*OLink;OLNode;
typedef struct
{
OLink *rhead,* chead; //行和链表头指针向量基址由createSmatrix分配
int mu,nu,tu; //系数矩阵的行数和列数及非零元个数
}CrossList,OLMatrix;
int CreateSMatrix_OL (CrossList &M)
{
//创建稀疏矩阵
int m=0,n=0,t=0;
int i=0,j=0,e=0;
OLink p,q;
//if(M) free(M);
cin>>m>>n>>t; //Scanf (&m,&n,&t);//输入M的函数,列数和非零元的个数
M.mu=m;
M.nu=n;
M.tu=t;
if(!(M.rhead=(OLink * )malloc((m+1) *sizeof(OLink)))) exit (OVERFLOW);
if(!(M.chead=(OLink * )malloc((n+1) *sizeof(OLink)))) exit (OVERFLOW);
M.rhead=NULL; // 初始化行列头指针向量;各行列链表为空链表
M.chead=NULL;
for (cin>>i>>j>>e;i!=0;cin>>i>>j>>e) //按任意次序输入非零元
{
if(!(p=(OLNode*)malloc(sizeof(OLNode)))) exit( OVERFLOW );
p->i=i; //生成节点
p->j=j;
p->e=e;
if(M.rhead[i]==NULL||M.rhead[i]->j>j)
{
p->right=M.rhead[i];
M.rhead[i] = p;
}
else
{ //寻找在行表中的插入位置
for(q =M.rhead[i];(q->right)&&q->right->j<j;q=q->right)
{
p->right =q->right;
q->right=p;
} //完成插入
if (M.chead[j] ==NULL||M.chead[j]->i>i)
{
p->down=M.chead[j];
M.chead[j]=p;
}
else
{ //寻找在行表中的插入位置
for(q=M.chead [j]; (q->down) && q->down->i<i;q= q->down)
{
p->down = q->down;
q->down = p;
}
}
}
}
return OK;
}//CreateSMatrix_OL
//============================实现矩阵相加========================================
void OLMatrix_Add(OLMatrix &A,OLMatrix B) //把十字链表表示的矩阵B加到A上
{
int i=0,j=0;
OLink *cp;
OLink p,pa,pb,pre;
for(j=1;j<=A.nu;j++) cp[j]=A.chead[j]; //向量cp存储每一列当前最后一个元素的指针
for(i=1;i<=A.mu;i++)
{
pa=A.rhead[i];
pb=B.rhead[i];
pre=NULL;
while(pb)
{
if(pa==NULL||pa->j>pb->j) //新插入一个结点
{
p=(OLNode*)malloc(sizeof(OLNode));
if(!pre)
A.rhead[i]=p;
else
pre->right=p;
p->right=pa;
pre=p;
p->i=i;
p->j=pb->j;
p->e=pb->e; //插入行链表中
if(!A.chead[p->j])
{
A.chead[p->j]=p;
p->down=NULL;
}
else
{
while(cp[p->j]->down)
cp[p->j]=cp[p->j]->down;
p->down=cp[p->j]->down;
cp[p->j]->down=p;
}
cp[p->j]=p; //插入列链表中
}//if
else if(pa->j<pb->j)
{
pre=pa;
pa=pa->right;
} //pa右移一步
else if(pa->e+pb->e)
{
pa->e+=pb->e;
pre=pa;
pa=pa->right;
pb=pb->right;
} //直接相加
else
{
if(!pre)
A.rhead[i]=pa->right;
else
pre->right=pa->right;
p=pa;
pa=pa->right; //从行链表中删除
if(A.chead[p->j]==p)
A.chead[p->j]=cp[p->j]=p->down;
else
cp[p->j]->down=p->down; //从列链表中删除
free (p);
}//else
}//while
}//for
}//OLMatrix_Add
//========================以三元组格式输出十字链表表示的矩阵=======================
void Print_OLMatrix(OLMatrix A)//以三元组格式输出十字链表表示的矩阵
{
OLink p;
for(int i=0;i<A.mu;i++)
{
if(A.rhead[i])
for(p=A.rhead[i];p;p=p->right) //逐次遍历每一个行链表
//printf("%d %d %d\n",i,p->j,p->e;
cout<<p->i<<p->j<<p->e<<endl;
}
}//Print_OLMatrix
int main()
{
CrossList ma,mb;
CreateSMatrix_OL(ma);
CreateSMatrix_OL(mb);
OLMatrix_Add(ma,mb);
Print_OLMatrix(ma);
return 0;
}
在实现的时候会出现问题,即插入行,列和数据后会出现好像是内存冲突。实现一下就晓得了。。。
调试好久也没搞懂