稀疏矩阵十字链表c语言表示,【提问】数据结构(c语言):用十字链表表示稀疏矩阵为什么出现...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

#include

#include

typedef int datatype;

typedef struct olnode

{

int i, j;

datatype e;

struct olnode *right, *down;

} olnode, *olink;

typedef struct

{

olink *rowhead, *colhead;

int x, y, len;

} crosslist;

void initmatrix(crosslist * m);

int creatematrix(crosslist * m);

void insertmatrix(crosslist * m, olink p);

void destroymatrix(crosslist * m);

void initmatrix(crosslist * m)

{

m->rowhead = m->colhead = NULL;

m->x = m->y = m->len = 0;

}// initmatrix

int creatematrix(crosslist * m)

{

int x = 0, y = 0, t = 0, i = 0, j = 0, e = 0, ord = 0;

olnode *p, *q;

if (m)

free(m);

printf("请输入稀疏矩阵的行数、列数和非零元个数:");

scanf("%d%d%d", &x, &y, &t);

m->x = x;

m->y = y;

m->len = t;

if (!(m->rowhead = (olink *) malloc((x + 1) * sizeof(olink))))

exit(-1);

if (!(m->colhead = (olink *) malloc((y + 1) * sizeof(olink))))

exit(-1);

m->rowhead = m->colhead = NULL;

for (ord = 0; ord < t; ord++)

{

printf("请输入非零元列数、行数和值:");

scanf("%d%d%d", &i, &j, &e);

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

exit(-1);

p->i = i;

p->j = j;

p->e = e;

if (m->rowhead[i] == NULL || m->rowhead[i]->j > j)

{

p->right = m->rowhead[i];

m->rowhead[i] = p;

}

else

{

for (q = m->rowhead[i]; (q->right) && q->right->j < j; q = q->right);

p->right = q->right;

q->right = p;

}

if (m->colhead[j] == NULL || m->colhead[j]->i > i)

{

p->down = m->colhead[j];

m->colhead[j] = p;

}

else

{

for (q = m->colhead[j]; (q->down) && q->down->i < i; q = q->down);

p->down = q->down;

q->down = p;

}

}

return 1;

}// creatematrix

void insertmatrix(crosslist * m, olink p)

{

// 按照行序将p插入到稀疏矩阵中

olink q = m->rowhead[p->i];

if (!q || p->j < q->j)

{

p->right = m->rowhead[p->i];

m->rowhead[p->i] = p;

}

else

{

while (q->right && q->right->j < p->j)

q = q->right;

p->right = q->right;

q->right = p;

}

q = m->colhead[p->j];

if (!q || p->i < q->i)

{

p->down = m->colhead[p->j];

m->colhead[p->j] = p;

}

else

{

while (q->down && q->down->i < p->i)

q = q->down;

p->down = q->down;

q->down = p;

}

m->len++;

}// insertmatrix

void destroymatrix(crosslist * m)

{

int i;

olink p, q;

for (i = 0; i < m->x; i++)

{

p = *(m->rowhead + i);

while (p)

{

q = p;

p = p->right;

free(q);

}

}

free(m->rowhead);

free(m->colhead);

initmatrix(m);

}// destroymatrix

int addmatrix(crosslist * m, crosslist * n)

{// 将矩阵N加到M中并删除N

if (m->x != n->y || m->y != n->y)

{

printf(" 您输的矩阵不能相加!\n");

return 1;

}

olink p, q;

p = (olnode *) malloc(sizeof(olnode));

for (int t = 1; t <= n->x; t++)

{

p = n->rowhead[t];// 取不到该值?为什么?

while (p)

{

q = (olnode *) malloc(sizeof(olnode));

q->down = p->down;

q->right = p->right;

q->e = p->e;

q->i = p->i;

q->j = p->j;

insertmatrix(&m, q);

p = p->right;

}

return 1;

}

}

int main()

{

crosslist a, b;

initmatrix(&a);

initmatrix(&b);

creatematrix(&a);

creatematrix(&b);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值