一:概念
既然要用鍊錶節點來模擬矩陣中的非零元素,肯定需要如下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、稀疏矩陣的**
4、**的部分解釋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;
}
(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...