【数据结构】稀疏矩阵的链式存储(十字链表)

“ Ctrl AC!一起 AC!”

目录

稀疏矩阵的十字链表表示:

十字链表中结点的结构:

创建稀疏矩阵的十字链表表示:

稀疏矩阵十字链表的查找:


稀疏矩阵的十字链表表示:

  • 每一行的非零元素构成一个带表头的环形链表
  • 每一列的非零元素构成一个带表头的环形链表
  • 第i行和第i列的表头是同一个
  • 所有表头结点构成一个新的带表头的环形链表

因此:

十字链表的表示中有非零元素结点和表头结点两类结点

【数据结构】稀疏矩阵的链式存储(十字链表)_第1张图片

【数据结构】稀疏矩阵的链式存储(十字链表)_第2张图片 

其中表头结点的row,col均为零,表头结点构成的环形链表的表头的row和col分别代表总行数和总列数。

【本例中的行下标和列下标均假设从1开始算起】

十字链表中结点的结构:

typedef struct matrixnode{
	int row,col;
	struct matrixnode *right,*down;
	union{
		int value;
		struct matrixnode *next;
	}tag;
}matrixnode;
typedef matrixnode *spmatrix; //指向上述结点的指针
typedef spmatrix headspmatrix[100]; // headspmatrix = 类型spmatrix+容量[100] = 类型matrixnode*+容量[100] 即指针数组

创建稀疏矩阵的十字链表表示:

void Createspmatrix(headspmatrix h){
	int m,n,t,s,i,r,c,v;
	spmatrix p,q; //两个结点指针,可召唤结点
	printf("矩阵的行数,列数和非零元素个数:");
	scanf("%d%d%d",&m,&n,&t);
	p=(spmatrix)malloc(sizeof(matrixnode));
	h[0]=p; //h[0]为表头环形链表的表头结点
	p->row=m;p->col=n;
	s=m>n?m:n; //表头结点数组的最大长度为s
	for(i=1;i<=s;i++){ //初始化
		p=(spmatrix)malloc(sizeof(matrixnode));
		h[i]=p;
		h[i-1]->tag.next=p; //上一个表头结点的下一个结点为p
		p->row=p->col=0;
		p->down=p->right=p;
	}
	h[s]->tag.next=h[0];
	for(int i=1;i<=t;i++){
		printf("请输入非零元素的行号,列号和值:");
		scanf("%d%d%d",&r,&c,&v);
		p=(spmatrix)malloc(sizeof(matrixnode));
		p->row=r;p->col=c;p->tag.val=v;
		q=h[r]; //将该非零元素插入到所在行的环形链表
		while(q->right!=h[r]&&q->right->colright;
		}
		p->right=q->right;
		q->right=p;
		q=h[c]; //将该非零元素插入到所在列的环形链表
		whiille(q->down!=h[c]&&q->down->rowdown;
		}
		p->down=q->down;
		q->down=p;
	}
}

稀疏矩阵十字链表的查找:

int locatespmatrix(headspmatrix h,int x,int *rowx,int *colx){
	spmatrix p,q;
	p=h[0]->tag.next; //从第一个表头出发(即第一行)
	while(p!=h[0]){
		q=p->right; //从该行的第一个非零元素开始查找
		while(q!=p){
			if(q->tag.val==x){
				*rowx=q->row;
				*colx=q->col;
				return 1; //查找成功
			}
			q=q->right; //该行下一个
		}
		p=p->tag.next; //下一行
	}
	return 0; //查找失败
}

感谢阅读!!!

“ Ctrl AC!一起 AC!”

你可能感兴趣的:(#,数据结构,数据结构)