#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: "); 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; }