稀疏矩陣十字鏈表表示法

稀疏矩陣十字鏈表表示法和基本運算

#include <stdio.h>
#include <malloc.h>
#define M 3         			//矩陣行
#define N 3            			//矩陣列
#define Max ((M)>(N)?(M):(N))   //矩陣行列較大者
typedef int ElemType;
typedef struct mtxn 
{ 
	int row;					//行號
	int col;					//列號
   	struct mtxn *right,*down;	//向右和向下的指針
	union 
	{
		ElemType value;
		struct mtxn *link;
	} tag;
} MatNode;			//十字鏈表類型定義
void CreatMat(MatNode *&mh,ElemType a[][N])
{
	int i,j;
	MatNode *h[Max],*p,*q,*r;
	mh=(MatNode *)malloc(sizeof(MatNode));//創建十字鏈表的頭節點
	mh->row=M;mh->col=N;
	r=mh;					//r指向尾節點
	for (i=0;i<Max;i++)		//採用尾插法創建頭節點h1,h2,…循環鏈表
	{
		h[i]=(MatNode *)malloc(sizeof(MatNode));
		h[i]->down=h[i]->right=h[i];		//將down和right方向置爲循環的
		r->tag.link=h[i];					//將h[i]加到鏈表中
		r=h[i];
	}
	r->tag.link=mh;							//置爲循環鏈表
	for (i=0;i<M;i++)						//處理每一行
	{
		for (j=0;j<N;j++)					//處理每一列
		{
			if (a[i][j]!=0)					//處理非零元素
			{
				p=(MatNode *)malloc(sizeof(MatNode));	//創建一個新節點
				p->row=i;p->col=j;p->tag.value=a[i][j];
				q=h[i];      					//查找在行表中的插入位置
                while (q->right!=h[i] && q->right->col<j) 
                  	q=q->right;
				p->right=q->right;q->right=p;	//完成行表的插入
				q=h[j];      					//查找在列表中的插入位置
				while (q->down!=h[j] && q->down->row<i) 
					q=q->down;
				p->down=q->down;q->down=p;  	//完成列表的插入
			}
		}
	}
}
void DispMat(MatNode *mh)
{
	MatNode *p,*q;
	printf("行=%d  列=%d\n", mh->row,mh->col);
	p=mh->tag.link;
	while (p!=mh) 
	{	
		q=p->right;
		while (p!=q) 		//輸出一行非零元素
		{
			printf("%d\t%d\t%d\n", q->row,q->col,q->tag.value);
			q=q->right;
		}
		p=p->tag.link;
	}
}
//本主程序用於調試
void main()
{
	ElemType a[M][N]={{1,0,3},{0,2,0},{0,0,5}};
	ElemType b[M][N]={{-1,0,2},{0,-2,0},{1,0,-5}};
	MatNode *mx,*my;
	CreatMat(mx,a);
	CreatMat(my,b);
	printf("a的十字鏈表:\n");DispMat(mx);
	printf("b的十字鏈表:\n");DispMat(my);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章