typedef struct OLNode{
int i,j; //该非零元的行列下标
ElemType e;
struct OLNode *right ,*down; //该非零元所在行表、列表的后继链域
} OLNode; *OLink;
typedef struct {
OLink *rhead , *chead; //行和列 链表头指针向量基址 由CreateSMatrix分配
int mu,nu,tu; //稀疏矩阵的行数列数及非零元个数
} CrossList;
Status CreateSMatrix_OL(CrossList &M)
{//创建稀疏矩阵M 采用十字链表存储表示
if(M)
{
free(M);
}
scanf(&m,&n,&t); //输入M的行数列数和非零元个数
M.mu = m;
M.nu= n;
m.tu = t;
if(!(M.rhead = (OLink *)malloc(sizeof(OLink)*(m+1))))
exit(OVERFLOW);
if(!(M.chead = (OLink *)malloc(sizeof(OLink)*(n+1))))
exit(OVERFLOW);
M.rhead[] = M.chead[] = NULL;//初始化行列头指针向量,各行列链表为空链表
for(scanf(&i,&j,&e); i != 0 ; scanf(&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 right);
p->right = q->right;
q->right = p;
} //完成行插入
if(M.chead[j] == NULL || M.rhead[j]->i >i)
{
p->dowm = M.chead[j];
M.chead[j] = p;
}
else
{
for(q = M.ched[j]; (q->down) && q->down->i < i; q= q->down);
p->down = q->down;
q->down = p; //完成列插入
}
}
}