稀疏矩陣的十字鏈表存儲


稀疏矩陣的壓縮存儲有幾種方式,如:三元組順序表、行邏輯鏈接的順序表和十字鏈表。

使用鏈表存儲的好處是:便於矩陣中元素的插入和刪除。

例如:“將矩陣B加到矩陣A上”,那么矩陣A存儲的元素就會有變動。比如會增加一些非零元,或者刪除一些元素(因為bij+aij=0)。

下圖是矩陣M和M的十字鏈表存儲:

十字鏈表及其結點可用如下結構體表示:

typedef struct OLNode{
    int i, j; // 非零元的行列下標
    ElemType e;
    struct OLNode *right, *down; // 向右域和向下域
} OLNode, *OLink;
typedef struct{
    OLink *rhead, *chead; // 行鏈表和列鏈表的頭指針數組
    int mu, nu, tu; // 稀疏矩陣的行數、列數和非零元個數
} CrossList;

在通過代碼創建十字鏈表時,要特別注意right、down和rhead、chead這些指針的賦值。

現在來看“將矩陣B加到矩陣A上”這個問題。所要做的操作:aij +bij,其結果一共會有4種情況:

  1. aij(bij = 0)(不做變化)
  2. bij(aij = 0)(在A中插入一個新結點)
  3. aij +bij ≠ 0 (改變結點aij的值域)
  4. aij +bij = 0 (刪除結點aij

假設指針pa和pb分別指向矩陣A和B中行值相同的兩個結點,對於上述4種情況的處理過程為:

  1. 若“pa == NULL”或“pa->j大於pb->j”,則在矩陣A中插入一個值為bij的結點。並且需要修改同一行前一結點的right指針,和同一列前一結點的down指針。
  2. 若“pa->j小於pb-j”,則pa指針右移一步。
  3. 若“pa->j等於pb-j”,並且“pa->e + pb->e != 0”,則修改pa->e即可。
  4. 若“pa->j等於pb-j”,並且“pa->e + pb->e == 0”,則需要刪除矩陣A中pa所指結點。並且需要修改同一行前一結點的right指針,和同一列前一結點的down指針。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM