#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
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)
{
int m, n, t, i, j, e;
OLNode *p, *q;
printf("input row 、col、total num:\n");
scanf("%d%d%d",&m, &n, &t);
M.mu = m; M.nu = n; M.tu = t;
if (!(M.rhead = (OLink *)malloc((m + 1)*sizeof(OLink))))
return ERROR;
if (!(M.chead = (OLink *)malloc((n + 1)*sizeof(OLink))))
return ERROR;
for ( i = 0; i <= m; ++i)
M.rhead[i] = NULL;
for ( i = 0; i <= n; ++i)
M.chead[i] = NULL;
for (scanf("%d%d%d", &i, &j, &e); i != 0; scanf("%d%d%d", &i, &j, &e))
{
if (!(p = (OLNode *)malloc(sizeof(OLNode))))
return ERROR;
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 < j; q = q->right);
p->right = q->right;
q->right = p;
} //完成行插入
if (M.chead[j] == NULL||M.chead[j]->i > i)
{
p->down = M.chead[j];
M.chead[j] = p;
}
else { //寻查在列表中的插入位置
for (q = M.chead[j];(q->down) && q->down->i < i; q = q->down);
p->down = q->down;
q->down = p;
} //完成列插入
}
return OK;
}