稀疏矩阵十字链表存储表示

#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;
}
    

 

转载于:https://www.cnblogs.com/gjfhopeful/p/3621110.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值