稀疏矩陣的建立 十字鍊錶

2021-07-16 08:17:20 字數 2488 閱讀 6667

一:概念

既然要用鍊錶節點來模擬矩陣中的非零元素,肯定需要如下5個元素(row,col,val,down,right),其中:

row:矩陣中的行。

col:矩陣中的列。

val:矩陣中的值。

right:指向右側的乙個非零元素。

down:指向下側的乙個非零元素。

現在我們知道單個節點該如何表示了,那麼矩陣中同行的非零元素的表示不就是乙個單鏈表嗎?比如如下:

那麼進一步來說乙個多行的非零元素的表示不就是多個單鏈表嗎,是的,這裡我把單鏈表做成迴圈鍊錶,我們來看看如何用十字鍊錶來表示稀疏矩陣。

從上面的十字鍊錶中要注意兩個問題:

第一:這裡有乙個填充色的節點,是十字鍊錶中的總結點,它是記錄該矩陣中的(row,col,value)和乙個指向下乙個頭節點的next指標。

第二:每個鍊錶都有乙個頭指標,總結點用next指標將它們貫穿起來。

二、稀疏矩陣的建立過程

1、稀疏矩陣節點的定義

typedef struct olnode olnode, *olist;
2、為了建立稀疏矩陣,除了需要知道行數、列數和非零個數以外,還需要建立行頭指標和列頭指標,定義如下:

typedef struct crosslist;
3、稀疏矩陣的**

int createsmatrix(crosslist *m)    

while (!flag);

m->mu = m;

m->nu = n;

m->tu = t;

//建立行煉表頭陣列

m->rhead = (olink *)malloc((m+1) * sizeof(olink));

if(!m->rhead)

exit(-1);

//建立列煉表頭陣列

m->chead = (olink *)malloc((n+1) * sizeof(olink));

if(!(m->chead))

exit(-1);

for(k=1;k<=m;k++) // 初始化行頭指標向量;各行鍊錶為空鍊錶

m->rhead[k]=null;

for(k=1;k<=n;k++) // 初始化列頭指標向量;各列鍊錶為空鍊錶

m->chead[k]=null;

//輸入各個結點

for (k=1; k<=t; ++k)

while (!flag); p = (olink) malloc (sizeof(olnode));

if (null == p)

exit(-1);

p->i = i;

p->j = j;

p->e = e;

//節點的行插入

if(null==m->rhead[i] || m->rhead[i]->j>j) //-----(1)

else // 尋查在行表中的插入位置

//節點的列插入

if(null==m->chead[j] || m->chead[j]->i>i)

else // 尋查在列表中的插入位置

} return 1;

}

4、**的部分解釋

(1)怎麼去找到要插入的正確位置。當行中有結點的時候我們無非就是插入到某個結點之前或者之後。那麼我們再回到前面,在我們定義rhead的時候就說過,某一行的表頭指標指向的就是該行中第乙個結點的位址。我們假設該行中已經有了乙個結點我們稱它為a結點,如果要插在a結點之前那麼a結點的列號必定是大於我們輸入的結點(我們稱它為p結點)的列號的。我們的插入操作就要修改頭指標與p結點的right域。就像鍊錶中的插入。那麼當該行中沒有結點的時候我們怎麼去插入?同樣是修改頭指標讓它指向我們的p結點,同樣要修改p結點的right域。看,我們可以利用if語句來實現這兩種條件的判斷。

(2)重點關注:for迴圈後緊跟" ; ",

現在我們再想一下怎麼去插入到某乙個結點的後面? 我們新建立的p結點要插入到現有的a結點的後面,那麼p的列號必定是大於a的列號,那麼我們只要找到第乙個大於比p的列號大的結點b,然後插入到b結點之前!如果現有的結點沒有乙個結點列號是大於p結點的列號的,那麼我們就應該插入到最後乙個結點之後!所以我們首先要尋找符合條件的位置進行插入  。

十字鍊錶 稀疏矩陣

include includetypedef struct olnode olnode,olink typedef struct 行和列煉表頭指標向量基址,由creatsmatrix ol 分配 crosslist 初始化m crosslist型別的變數必須初始化,否則建立 複製矩陣將出錯 bool...

稀疏矩陣相加(十字鍊錶儲存)

標頭檔案 linklist.h inte ce for the linklist class.if defined afx linklist h 0f0cca3e d836 4bb4 9030 b548558fc57e included define afx linklist h 0f0cca3e ...

演算法5 4 建立稀疏矩陣的十字鍊錶 rar

crosslistarray.h include include define null 0 十字鍊錶的結構型別定義如下 typedef struct olnode olnode,olink typedef struct crosslist 建立稀疏矩陣的十字鍊錶的演算法 include cross...