稀疏矩阵的十字链表存储

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_42868863/article/details/89472273