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