typedef int ElemType;
typedef struct matnode
{
int row, col; //结点的行域和列域
struct matnode *right, *down;//结点的向下域(down)和向右域(right)
union //结点的数据域,若为表头结点则无数值,而用指向其后继的指针代替
{
ElemType data;
struct matnode *next;
} tag;
} CrossNode, *CrossList;
void CreateHead(CrossList Head[], int len); //创建十字链表的表头结点
void Insert(CrossList Head[], int r, int c, ElemType v);//插入新的结点
CrossList CreateSMatrix_OL(int m, int n); //创建一个十字链表
void PrintCrossList(CrossList T);//输出十字链表存储矩阵
void PrintArray(int H[][N], int m, int n); //输出二维数组存储矩阵
CrossList ArrayToCrossList(int A[][N], int m, int n);//二维数组转换为十字链表
void CrossListToArray(CrossList T, int A[][N], int *m, int *n);//十字链表转换为二维数组
CrossList TransposeCrossList(const CrossList M); //十字链表存储转置矩阵
CrossList AddSMatrix(const CrossList A, const CrossList B);//十字链表存储矩阵矩阵相加
CrossList MultCrossList(const CrossList A, const CrossList B);//十字链表存储矩阵矩阵相乘
int main(void)
{
int m, n;
ElemType A[N][N], B[N][N]; //存储矩阵的二维数组
CrossList CL1=NULL, CL2=NULL, CL3=NULL, CL4=NULL, CL5=NULL; // 十字链表
m = 3;
n = 2;
CL1 = CreateSMatrix_OL(m, n); //创建一个十字链表
PrintCrossList(CL1);//输出十字链表存储矩阵
CrossListToArray(CL1, A, &m, &n);//十字链表转换为二维数组
PrintArray(A, m, n); //输出二维数组存储矩阵
CL2 = ArrayToCrossList(A, m, n); //二维数组转换为十字链表
PrintCrossList(CL2);//输出十字链表存储矩阵
CrossList CreateSMatrix_OL(int m, int n) //创建一个十字链表
{
int s; //头结点个数s
int r, c;//元素的行号r,列号c
ElemType v;//元素的值v
CrossList Head[MAXRC], p, q;
s = m > n ? m : n;//因为序号相同行头和列头共用一个结点,故只要分配s个表头结点就好了
CreateHead(Head, s);//创建十字链表的表头结点
puts("请按行序为主序依次输入矩阵的非零元素的行号,列号和元素值,每行输入一个元素的信息:");
printf("注意行号不能超过%d,列号不能超过%d,否则结束输入\n", m, n); //生成结点
do {
scanf("%d%d%d", &r, &c, &v);
fflush(stdin);
if (r > 0 && r <= m && c > 0 && c <= n)
{
Insert(Head, r, c, v);
}
} while (r > 0 && r <= m && c > 0 && c <= n) ;
Head[0]->row = m; //总表头Head[0]的行域存储矩阵的总行数
Head[0]->col = n; //总表头Head[0]的列域存储矩阵的总列数
return Head[0]; //返回总表头结点
}
void PrintCrossList(CrossList T)//输出十字链表存储矩阵
{
int k = 0;
CrossList p, q; //p指向行头,q指向非零元素结点