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

// Header.h

#ifndef HEADER_H
#define HEADER_H    1

// 预定义常量和类型
// 函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int Status;

#endif // HEADER_H


//

// CrossList.h

#ifndef CROSSLIST_H
#define CROSSLIST_H 1

#include <iostream>
#include "Header.h"
using namespace std;

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

typedef int ElemType;

typedef struct OLNode {
    int i, j; // 该非零元的行和列下标
    ElemType e;
    OLNode *right, *down;
} *OLink;

struct CrossList {
    OLink *rhead, *chead; // 行和列链表头指针向量基址由CreateSMatrix分配
    int mu, nu, tu; // 稀疏矩阵的行数,列数和非零元个数
};

// 创建稀疏矩阵M,采用十字链表存储表示
Status CreateSMatrix(CrossList& M);
ostream& operator<<(ostream& os, const CrossList& m);

#endif // CROSSLIST_H


//

// CrossList.cpp

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <new>
#include "CrossList.h"

#define MU 5
#define NU 5
#define TU 5

using namespace std;

Status CreateSMatrix(CrossList& M)
{
    OLNode *p, *q;
    int i, j, e;
/*
    srand(time(NULL));
    M.mu = rand() % 5 + 5;
    M.nu = rand() % 5 + 5;
    M.tu = rand() % 10;
*/
    M.mu = MU;
    M.nu = NU;
    M.tu = TU;

    try {
        M.rhead = new OLink[M.mu + 1];
        M.chead = new OLink[M.nu + 1];
    } catch(bad_alloc& ba) {
        cerr << ba.what() << endl;
    }

    for (int i = 1; i <= M.mu; ++i)
        *(M.rhead + i) = NULL;
    for (int i = 1; i <= M.nu; ++i)
        *(M.chead + i) = NULL;

    while (cin >> i >> j >> e) {
        try {
            p = new OLNode;
        } catch(bad_alloc& ba) {
            cerr << ba.what() << endl;
        }

        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;
        }
    }
    cin.clear();
    cin.ignore();

    return OK;
}   

ostream& operator<<(ostream& os, const CrossList& m)
{
    OLNode *p;
    for (int i = 1; i <= m.mu; ++i) {
        p = *(m.rhead + i);
        while (p) {
            os << p->i << " " << p->j << " " << p->e;
            os << endl;
            p = p->right;
        }
    }

    return os;
}


///

// main.cpp

#include <iostream>
#include <cstdlib>
#include <ctime>
#include "CrossList.h"

using namespace std;

int main()
{
    CrossList m;
    CreateSMatrix(m);
    cout << m;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值