又要從頭學資料結構了。
默默挨個實現一遍
實現的功能包括兩個矩陣的加減 相乘 還有轉置
有點繁瑣
湊合看吧
#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 ...