#ifndef CROSSMATRIX_H_
#define CROSSMATRIX_H_
#define FLOWOVER -1
struct SCMNode;//节点
typedef int elemType;//数据域数据类型
typedef struct SCMNode * CMNode;//指向节点的指针
/**************结构体声明与定义**************/
struct SCMNode{
<span style="white-space:pre"> </span>int row;//节点行号
<span style="white-space:pre"> </span>int col;//节点列号
<span style="white-space:pre"> </span>elemType elem;//节点的数值
<span style="white-space:pre"> </span>struct SCMNode * right;//指向节点右侧的下个非零元,若没有则为NULL
<span style="white-space:pre"> </span>struct SCMNode * down;//指向节点下方的下个非零元,若没有则为NULL
};
typedef struct{
<span style="white-space:pre"> </span>CMNode *rowhead;//指针数组,rowhead[1],存的是矩阵第1行第一个节点的地址,若为空行,值为NULL
<span style="white-space:pre"> </span>CMNode *colhead;//指针数组,colhead[1],存的是矩阵第1列第一个节点的地址,若为空列,值为NULL
<span style="white-space:pre"> </span>int numOfRow;//表示矩阵的总行数
<span style="white-space:pre"> </span>int numOfCol;//表示矩阵的总列数
<span style="white-space:pre"> </span>int numOfElem;//表示矩阵的非零元总数
}CrossMatrix;//表头,不是指针,代表十字矩阵本身
/**************方法声明**************/
//创建一个新节点,为后续一些方法的辅助函数
void NewNdoe(CMNode &N, int r, int c, elemType e);
//输入行列数,创建一个空稀疏矩阵
void CreatMatrix(CrossMatrix &CM, int nR, int nC);
//构建并赋值,初始化一个新稀疏矩阵
void InitMatrix(CrossMatrix &CM, int nR, int nC, int nE);
//清空稀疏矩阵
void ClearMatrix(CrossMatrix &CM);
//输出稀疏矩阵
void PrintMatrix(CrossMatrix &CM);
//在输入指针指向的节点左方增加一个新节点,为下面几个运算的辅助函数
void AddNode(CrossMatrix &A, CMNode newN, int r, int c, elemType e);
//删除指定矩阵的指定节点,为下面几个运算的辅助函数
void DeleteNode(CrossMatrix &A, CMNode rowOfA);
//M、N行列数相同,将矩阵M、N相加赋值给M,M = M + N
void AddMatrix(CrossMatrix &M, CrossMatrix N);
//M、N行列数相同,将矩阵M、N相减赋值给M,M = M - N
void SubMatrix(CrossMatrix &M, CrossMatrix N);
//M行数等于N列数,M列数等于N行数,将矩阵M、N相乘赋值给Q,Q = M * N
void MultMatrix(CrossMatrix &Q, CrossMatrix M, CrossMatrix N);
//M转置得到T
void TransposeMatrix(CrossMatrix &T, CrossMatrix M);
#endif
#include "CrossMatrix.h"
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#pragma warning(disable:4996)
void NewNdoe(CMNode &N, int r, int c, elemType e)
{
N = (CMNode)malloc(sizeof(struct SCMNode));
if (N == NULL)
exit(FLOWOVER);
N->row = r;
N->col = c;
N->elem = e;
N->right = NULL;
N->down = NULL;
}
void CreatMatrix(CrossMatrix &CM