https://bbs.csdn.net/topics/370157573
这道题我就是对这个地方不理解,看了这个帖子,似乎领悟了
写下我自己的想法。
稀疏矩阵的十字链表存储,本来就是每一行形成一个链表、每一列形成一个链表(此时是指向node的,也就是node),而每一列或者每一行的链表都有都一个结点,这样结点又构成了一个新的链表(是指向node,也就是**node)
假如这样,一级指针
struct node{
struct *next;
}node;
node *p = .........,*q = .........;
那么就是p->next = q;
二级指针也是类似
这是完整代码
#include <stdio.h>
#include <malloc.h>
typedef struct node{
int i,j,e;
struct node *right,*down;
}node,*Lnode;
typedef struct CrossList{
Lnode *rhead,*chead;
int mu,nu,tu;
}CrossList;
void create(CrossList *m)
{
int mm,nn;
Lnode q;
scanf("%d %d",&mm,&nn);
m->mu = mm;
m->nu = nn;
m->tu = 0;
m->rhead = (Lnode*)malloc(sizeof(Lnode)*(mm+1));
m->chead = (Lnode*)malloc(sizeof(Lnode)*(nn+1));
for(int i = 1;i <= mm;i++){
Lnode p = (Lnode)malloc(sizeof(node));
p->right = NULL;
m->rhead[i] = p;
}
for(int i = 1;i <= nn;i++){
Lnode p = (Lnode)malloc(sizeof(node));
p->down = NULL;
m->chead[i] = p;
}
for(int i = 1;i <= mm;i++){
for(int j = 1;j <= nn;j++){
int data;
scanf("%d",&data);
if(data){
Lnode p = (Lnode)malloc(sizeof(node));
p->i = i;
p->j = j;
p->e = data;
for(q = m->rhead[i];q->right;q = q->right);
p->right = q->right;
q->right = p;
for(q = m->chead[j];q->down;q = q->down);
p->down = q->down;
q->down = p;
}
}
}
}
void print(CrossList *m)
{
Lnode p;
for(int i = 1;i <= m->mu;i++){
p = m->rhead[i]->right;
for(int j = 1;j <= m->nu;j++){
if(p && p->i == i && p->j == j){
printf("%d ",p->e);
p = p->right;
}else printf("%d ",0);
}
printf("\n");
}
}
int main()
{
CrossList M;
create(&M);
print(&M);
return 0;
}