稀疏矩陣的十字鍊錶實現(C語言實現)

2021-06-28 15:06:03 字數 4685 閱讀 1780

又要從頭學資料結構了。

默默挨個實現一遍

實現的功能包括兩個矩陣的加減 相乘 還有轉置 

有點繁瑣 

湊合看吧

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

typedef struct olnode

olnode,*olink;

typedef struct

crosslist;

//初始化m

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...

稀疏矩陣的建立 十字鍊錶

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

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

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