用十字鍊錶實現兩個稀疏矩陣的和矩陣差矩陣乘矩陣

2021-08-21 11:19:38 字數 4681 閱讀 4517

#include #include #includetypedef int elemtype;// 稀疏矩陣的十字鍊錶儲存表示

typedef struct olnode

olnode, *olink;

typedef struct // 行和列煉表頭指標向量基址,由creatsmatrix_ol()分配

crosslist;

// 初始化m(crosslist型別的變數必須初始化,否則建立、複製矩陣將出錯)

int initsmatrix(crosslist *m)

// 銷毀稀疏矩陣m

int destroysmatrix(crosslist *m)

}free((*m).rhead);

free((*m).chead);

(*m).rhead=(*m).chead=null;

(*m).mu=(*m).nu=(*m).tu=0;

return 1;

}// 建立稀疏矩陣m,採用十字鍊錶儲存表示。

int createsmatrix(crosslist *m)

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

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

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

}return 1;

}// 按行或按列輸出稀疏矩陣m

int printsmatrix(crosslist m)

}break;

case 2:

for(j=1; j<=m.nu; j++)}}

return 1;

}// 由稀疏矩陣m複製得到t

int copysmatrix(crosslist m,crosslist *t)

else // 插在列表尾

p=p->right;

}q->right=null;

}return 1;

}// 求稀疏矩陣的和q=m+n

int addsmatrix(crosslist m,crosslist n,crosslist *q)

(*q).mu=m.mu; // 初始化q矩陣

(*q).nu=m.nu;

(*q).tu=0; // 元素個數的初值

(*q).rhead=(olink*)malloc(((*q).mu+1)*sizeof(olink));

if(!(*q).rhead)

exit(0);

(*q).chead=(olink*)malloc(((*q).nu+1)*sizeof(olink));

if(!(*q).chead)

exit(0);

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

(*q).rhead[k]=null;

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

(*q).chead[k]=null;

// 生成指向列的最後結點的陣列

col=(olink*)malloc(((*q).nu+1)*sizeof(olink));

if(!col)

exit(0);

for(k=1; k<=(*q).nu; k++) // 賦初值

col[k]=null;

for(i=1; i<=m.mu; i++) // 按行的順序相加

else if(pm->j>pn->j) // 矩陣m當前結點的列大於矩陣n當前結點的列

// 矩陣m、n當前結點的列相等且兩元素之和不為0

else if(pm->e+pn->e)

else // 矩陣m、n當前結點的列相等且兩元素之和為0

if((*q).rhead[i]==null) // p為該行的第1個結點

// p插在該行的表頭且pq指向p(該行的最後乙個結點)

(*q).rhead[i]=pq=p;

else // 插在pq所指結點之後

if((*q).chead[p->j]==null) // p為該列的第1個結點

// p插在該列的表頭且col[p->j]指向p

(*q).chead[p->j]=col[p->j]=p;

else // 插在col[p->]所指結點之後

}while(pm) // 將矩陣m該行的剩餘元素插入矩陣q

if((*q).chead[p->j] == null) // p為該列的第1個結點

// p插在該列的表頭且col[p->j]指向p

(*q).chead[p->j] = col[p->j] = p;

else // 插在col[p->j]所指結點之後

}while(pn) // 將矩陣n該行的剩餘元素插入矩陣q

if((*q).chead[p->j]==null) // p為該列的第1個結點

// p插在該列的表頭且col[p->j]指向p

(*q).chead[p->j]=col[p->j]=p;

else // 插在col[p->j]所指結點之後}}

for(k=1; k<=(*q).nu; k++)

if(col[k]) // k列有結點

col[k]->down=null; // 令該列最後乙個結點的down指標為空

free(col);

return 1;

}// 求稀疏矩陣的差q=m-n

int subtsmatrix(crosslist m,crosslist n,crosslist *q)

(*q).mu=m.mu; // 初始化q矩陣

(*q).nu=m.nu;

(*q).tu=0; // 元素個數的初值

(*q).rhead=(olink*)malloc(((*q).mu+1)*sizeof(olink));

if(!(*q).rhead)

exit(0);

(*q).chead=(olink*)malloc(((*q).nu+1)*sizeof(olink));

if(!(*q).chead)

exit(0);

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

(*q).rhead[k]=null;

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

(*q).chead[k]=null;

// 生成指向列的最後結點的陣列

col=(olink*)malloc(((*q).nu+1)*sizeof(olink));

if(!col)

exit(0);

for(k=1; k<=(*q).nu; k++) // 賦初值

col[k]=null;

for(i=1; i<=m.mu; i++) // 按行的順序相加

// 矩陣m當前結點的列大於矩陣n當前結點的列

else if(pm->j>pn->j)

else if(pm->e-pn->e)

else // 矩陣m、n當前結點的列相等且兩元素之差為0

if((*q).rhead[i]==null) // p為該行的第1個結點

// p插在該行的表頭且pq指向p(該行的最後乙個結點)

(*q).rhead[i]=pq=p;

else // 插在pq所指結點之後

if((*q).chead[p->j]==null) // p為該列的第1個結點

// p插在該列的表頭且col[p->j]指向p

(*q).chead[p->j]=col[p->j]=p;

else // 插在col[p->]所指結點之後

}while(pm) // 將矩陣m該行的剩餘元素插入矩陣q

if((*q).chead[p->j]==null) // p為該列的第1個結點

// p插在該列的表頭且col[p->j]指向p

(*q).chead[p->j]=col[p->j]=p;

else // 插在col[p->j]所指結點之後

}while(pn) // 將矩陣n該行的剩餘元素插入矩陣q

if((*q).chead[p->j]==null) // p為該列的第1個結點

// p插在該列的表頭且col[p->j]指向p

(*q).chead[p->j]=col[p->j]=p;

else // 插在col[p->j]所指結點之後}}

for(k=1; k<=(*q).nu; k++)

if(col[k]) // k列有結點

col[k]->down=null; // 令該列最後乙個結點的down指標為空

free(col);

return 1;

}// 求稀疏矩陣乘積q=m*n

int multsmatrix(crosslist m,crosslist n,crosslist *q)

}if(e) // 值不為0}}

return 1;

}// 求稀疏矩陣m的轉置矩陣t

int transposesmatrix(crosslist m,crosslist *t)

}return 1;

}int main()

十字鍊錶 稀疏矩陣

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

稀疏矩陣加法,用十字鍊錶實現C A B

輸入兩個稀疏矩陣,輸出它們相加的結果。第一行輸入四個正整數,分別是兩個矩陣的行m 列n 第乙個矩陣的非零元素的個數t1和第二個矩陣的非零元素的個數t2。接下來的t1 t2行是三元組,分別是第乙個矩陣的資料和第二個矩陣的資料。三元組的第乙個元素表示行號,第二個元素表示列號,第三個元素是該項的值。輸出相...

稀疏矩陣的建立 十字鍊錶

一 概念 既然要用鍊錶節點來模擬矩陣中的非零元素,肯定需要如下5個元素 row,col,val,down,right 其中 row 矩陣中的行。col 矩陣中的列。val 矩陣中的值。right 指向右側的乙個非零元素。down 指向下側的乙個非零元素。現在我們知道單個節點該如何表示了,那麼矩陣中同...