十字链表表示矩阵c语言,十字链表法,十字链表压缩存储稀疏矩阵详解

对于压缩存储稀疏矩阵,无论是使用

3f8036b7ebfab3106d783e0471975c69.png

图 1 十字链表示意图

可以看到,使用十字链表压缩存储稀疏矩阵时,矩阵中的各行各列都各用一各链表存储,与此同时,所有行链表的表头存储到一个数组(rhead),所有列链表的表头存储到另一个数组(chead)中。

因此,各个链表中节点的结构应如图 2 所示:

ca1b3fe64d3a7ab0e74ca2f7f15dfc6f.png

图 2 十字链表的节点结构

两个指针域分别用于链接所在行的下一个元素以及所在列的下一个元素。

链表中节点的 C 语言代码表示应为:

typedef struct OLNode{

int i,j;//元素的行标和列标

int data;//元素的值

struct OLNode * right,*down;//两个指针域

}OLNode;

同时,表示十字链表结构的 C 语言代码应为:

#include

#include

typedef struct OLNode

{

int i, j, e; //矩阵三元组i代表行 j代表列 e代表当前位置的数据

struct OLNode *right, *down; //指针域 右指针 下指针

}OLNode, *OLink;

typedef struct

{

OLink *rhead, *chead; //行和列链表头指针

int mu, nu, tu; //矩阵的行数,列数和非零元的个数

}CrossList;

CrossList CreateMatrix_OL(CrossList M);

void display(CrossList M);

int main()

{

CrossList M;

M.rhead = NULL;

M.chead = NULL;

M = CreateMatrix_OL(M);

printf("输出矩阵M:\n");

display(M);

return 0;

}

CrossList CreateMatrix_OL(CrossList M)

{

int m, n, t;

int i, j, e;

OLNode *p, *q;

printf("输入矩阵的行数、列数和非0元素个数:");

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))) || !(M.chead = (OLink*)malloc((n + 1) * sizeof(OLink))))

{

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)) {

if (!(p = (OLNode*)malloc(sizeof(OLNode))))

{

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;

}

}

}

}

运行结果:

输入矩阵的行数、列数和非0元素个数:3 3 3

2 2 3

2 3 4

3 2 5

0 0 0

输出矩阵M:

2       2       3

3       2       5

2       3       4

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值