这是C语言描述的十字链表:
#include <stdio.h>
#include <stdlib.h>
//创建非零元素结点
typedef struct OLNode
{
int row,col;
Elemtype value;
struct OLNode *right,*down;
}OLNode,*OLink;
//指向非零行列的数组指针
typedef struct
{
OLink *rowhead,*colhead;
int rows,cols,nums;
}*CrossList;
int InitCrossList(CrossList *CL,Elemtype *A,int m,int n)
{
int i,j;
OLNode p,q;
(*CL) = (CrossList)molloc(sizeof(CrossList));
if(!(*CL)->rowhead)
{
printf("无法生成十字链表!");
return 0;
}
//初始化行
(*CL)->rows = m;
//初始化列
(*CL)->cols = n;
//记录非零个数
(*CL)->nums = 0;
(*CL)->rowhead = (OLink *)malloc(m * sizeof(OLink));
if(!(*CL) -> rowhead)
{
printf("无法生成行指针数组!");
return 0;
}
for(i = 0; i < m; i++)
(*CL)->rowhead[i] = NULL;//初始化
(*CL)->colhead = (OLink *)malloc(n * sizeof(OLink));
if(!(*CL)->colhead)
{
printf("无法生成列指针数组!");
return 0;
}
for(i = 0; i < m; i++)
for(j = 0; j < n;j++)
{
if(A[i*n+j]!=0)//判断是否非零
{
p = (OLink *)malloc(sizeof(OLNode));
//填入所在行数
p -> row = i++;
//填入所在列数
p -> col = j++;
//填入数字
p -> value = A[i*n+j];
p -> right = NULL;
p -> down = NULL;
(*CL) -> nums++;
//判断是否是这一行的第一个非零元素
if((*CL) -> rowhead[i]!=NULL)
{
//从本行头遍历
q=(*CL) -> rowhead[i];
while(q->right!=NULL&&q->col < j+1)
q=q->right;
//遍历到本行最后一个非零元素
p->right = q->right;//尾插法
q->right = p;
}
//如果是本行第一个非零元素则行头直接是新创造的结点
else (*CL)->rowhead[i] = p;
//与行操作类似
if((*CL) -> colhead[j]!=NULL)
{
q=(*CL)->colhead[j];
while (q->down!=NULL && q->row < i+1)
q = q->down;
p->down = q->down;
q->down = p;
}
else (*CL)->colhead[j] = p;
}
}
return 1;
}