该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#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);
}