稀疏矩陣的十字鏈表的建立

係數矩陣的十字鏈表表示法,在我的學習過程中,是個不怎麼好掌握的地方,難點就是它的具體建立過程,廢話不多說,這是我學習時候的代碼,註釋很詳細,歡迎指正學習和交流


/*
建立稀疏矩陣的十字鏈表
*/ 
typedef struct node
{ int row, col;
struct node *down , *right;
union v_next
{ datatype v;
struct node *next;
}
} MNode,*MLink;



MLink CreatMLink() /*返回十字鏈表的頭指針*/
{ 
MLink H;//指針 

Mnode *p,*q,*hd[s+1];//s的大小是矩陣行數以及列數的較大值, 
/*p,q爲輔助操作指針,hd爲輔助數組,存儲的是頭節點的地址,這樣便於行或者列的隨機訪問*/ 
int i,j,m,n,t;
/*i,j是讀取矩陣元素的行和列,m,n是整個矩陣的行數目和列數目,t是非零項的數目*/ 
datatype v;
/*矩陣所存儲的值*/ 
scanf(“%d,%,%d”,&m,&n,&t);//讀取需要建立的矩陣的基本信息 

H=malloc(sizeof(MNode)); /*申請總頭結點*/
H->row=m; H->col=n;

hd[0]=H;//將頭節點記錄在輔助數組中
 
for(i=1; i<s; i++)//分配s個頭節點 
{ 
	p=malloc(sizeof(MNode)); /*申請第i 個頭結點*/
	p->row=0; p->col=0;
	p->right=p;
	p->down=p;//初始化行和列的循環鏈表 
	hd[i]=p;//將頭節點地址記錄在輔助數組中 
	hd[i-1]->v_next.next=p;//並與上一個頭節點的next連接起來 
}

hd[S]->v_next.next=H;//最終,頭節點們形成一個循環鏈表
/*
這裏需要注意的是,並不是像結構圖上的那樣,有行頭節點和列頭節點,其實行和列公用頭節點 
*/ 

for(k=1;k<=t;k++)//輸入k個非零的三元組,並插入十字鏈表中 
{
	scanf (“%d,%d,%d”,&i,&j,&v);
	p=malloc(sizeof(MNode));
	p->row=i ; p->col=j; p->v_next.v=v
/*以下是將*p 插入到第i 行鏈表中去,且按列號有序*/
	q=hd[i];//從輔助數組中得到所在行的行頭節點地址 
	while(q->right!=hd[i] && (q->right->col)<j )//遍歷查找,找到要插入的列,終止條件是,起初就是空鏈,或者找到了比自己更大的第一個列號 
		q=q->right;
	p->right=q->right; //插入操作,拆鏈 
	q->right=p;//連接 
/*以下是將*p 插入到第j 行鏈表中去,且按行號有序*/
	q=hd[i];
	while ( q->down!=hd[j] && (q->down->row)<i ) /*按行號找位置*/
	q=q->down;
	p-> down =q-> down; /*插入*/
	q-> down =p;
} /*for k*/
return H;
} /* CreatMLink */


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