—— 头文件
#include <stdio.h>
#include <stdlib.h>
利用结构体声明元素节点
typedef struct OLNode{
int i, j, e;
struct OLNode *right, *down;
} OLNode, *OLink;
利用结构体声明矩阵节点
typedef struct{
OLink *rhead, *chead;
int mu, nu, tu;
} CrossList;
构造初始化十字链表矩阵的函数
CrossList CreateMatrix_OL(CrossList M){
int i, j, e;
OLNode *p, *q;
int m, n, t;
printf("输入矩阵的行数、列数和非0元素个数:");
scanf("%d%d%d", &m, &n, &t);
M.mu = m, M.nu = n, M.tu = t;
M.rhead = (OLink*)malloc((m+1)*sizeof(OLink));
M.chead = (OLink*)malloc((n+1)*sizeof(OLink));
if (!(M.rhead) || !(M.chead)){
printf("初始化矩阵失败");
exit(0);
}
for (i = 1; i <= m; i++){
M.rhead[i] = NULL;
}
for (j = 1; j <= n; j++){
M.chead[j] = NULL;
}
for (scanf("%d%d%d", &i, &j, &e); 0 != i; scanf("%d%d%d", &i, &j, &e)){
p = (OLNode*)malloc(sizeof(OLNode));
if(!p){
printf("初始化三元组失败");
exit(0);
}
p->i = i, p->j = j, p->e = e;
if (NULL == M.rhead[i] || 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 (NULL == M.chead[j] || 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 M;
}
构造展示十字链表的函数
void display(CrossList M){
for(int i = 1; i <= M.nu; i++){
if (NULL != M.chead[i]){
OLink p = M.chead[i];
while (NULL != p){
printf("%d\t%d\t%d\n", p->i, p->j, p->e);
p = p->down;
}
}
}
}
—— 主函数
int main(){
CrossList M;
M.rhead = NULL;
M.chead = NULL;
M = CreateMatrix_OL(M);
printf("输出矩阵M:\n");
display(M);
return 0;
}