记录十字链表打印矩阵## 标题
源码
#include<iostream>
using namespace std;
#define maxSize 4
//十字链表存储矩阵
//普通结点结构定义
typedef struct OLNode
{
int col,row;//列号,行号
struct OLNode *right,*down;
float val;
}OLNode;
//头结点结构定义
typedef struct
{
OLNode *rhead,*chead;
int m,n,k; //矩阵行数,列数以及非零结点总数
}CrossList;
//给定一个稀疏矩阵A,m*n,非零元素总数为k,建立与其对应的十字链表存储结构
int createcrossListmat(float A[][maxSize],int m, int n, int k, CrossList &M)
{
//M为头结点
if(M.rhead)
free(M.rhead);
if(M.chead)
free(M.chead);
M.m=m;
M.n=n;
M.k=k;
//申请头结点数组空间
if(!(M.chead=(OLNode*)malloc(sizeof(OLNode)*m)))//若结点申请失败
return 0;
if(!(M.rhead=(OLNode*)malloc(sizeof(OLNode)*n)))//若申请失败
return 0;
//头结点数组right和down指针置空
for(int i=0;i<m;++i)
{
M.chead[i].right=NULL;
M.chead[i].down=NULL;
}
for(int i=0;i<n;++i)
{
M.rhead[i].right=NULL;
M.rhead[i].down=NULL;
}
OLNode *temps[maxSize];//建立列链表的辅助指针数组
for(int i=0;i<n;++i)
{
temps[i]=&(M.rhead[i]);
}
for(int i=0;i<m;++i)
{
OLNode *r=&(M.chead[i]);
for(int j=0;j<n;++j)
{
if(A[i][j]!=0)
{
OLNode *p=(OLNode*)malloc(sizeof(OLNode));
p->row=i;
p->col=j;
p->val=A[i][j];
p->down=NULL;
p->right=NULL;
r->right=p;
r=p;
temps[j]->down=p;
temps[j]=p;
}
}
}
return 1;
}
int main()
{
float A[][maxSize]={
{
0,0,0,1},{
0,0,3,2},{
1,0,0,0},{
0,2,0,0},{
1,2,34,4}};
CrossList M;
M.chead=NULL;
M.rhead=NULL;
createcrossListmat(A,5,4,9,M);
for(int i=0;i<M.m;++i