#include <cstdio>#include <cstdlib>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXSIZE 100typedef int Status;typedef float ElemType;typedef struct{//三元组结构int i, j;//非零元素行下标和列下标ElemType e;//非零元素值}Triple;typedef struct{Triple data[MAXSIZE + 1];//非零元三元组表,data[0]不用int mu, nu, tu;//矩阵的行数、列数和非零元素个数}TSMatrix;TSMatrix NewMatrix(int m, int n);//新建一个三元组表示的稀疏矩阵Status InsertElem(TSMatrix *M, int row, int col, ElemType e);//在三元组表示的稀疏矩阵M,第 row 行,第 col 列位置插入元素e//插入成功,返回OK,否则返回ERRORStatus FindElem(const TSMatrix *M, int row, int col, ElemType *e);//查找三元组表示的稀疏矩阵M中,第 row 行,第 col列元素,若不为0,//则用e返回其值,并返回TRUE,否则返回FALSEStatus TransposeSMatrix(const TSMatrix *M, TSMatrix *T);//采用三元组表存储表示,求稀疏矩阵M的转置矩阵TStatus FastTransposeSMatrix(const TSMatrix *M, TSMatrix *T);//利用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵TStatus MultSMatrix(const TSMatrix *M, const TSMatrix *T, TSMatrix *Q);//稀疏矩阵的乘法,如果符合乘法规则,Q返回M*T结果,并返回OK,否则返回ERRORvoid PrintSMatrix(const TSMatrix *M);//打印稀疏矩阵所有元素int main(){TSMatrix M = NewMatrix(3, 4);TSMatrix T;TSMatrix Q;InsertElem(&M, 3, 2, 3.65);InsertElem(&M, 2, 2, 2.31);printf("\nM:");PrintSMatrix(&M);FastTransposeSMatrix(&M, &T);printf("\nT(Transpose of M):");PrintSMatrix(&T);MultSMatrix(&M, &T, &Q);printf("\nM*T=");PrintSMatrix(&Q);return 0;}TSMatrix NewMatrix(int m, int n){//新建一个三元组表示的稀疏矩阵TSMatrix M;M.mu = m;M.nu = n;M.tu = 0;return M;}Status InsertElem(TSMatrix *M, int row, int col, ElemType e){//在三元组表示的稀疏矩阵M,第 row 行,第 col 列位置插入元素e//插入成功,返回OK,否则返回ERRORint i, t, p;if (M->tu >= MAXSIZE){//当前三元组表已满printf("\nError:There is no space in the matrix;\n");return ERROR;}if (row>M->mu || col>M->nu || row<1 || col<1){//插入位置越界,不在1~mu或1~nu之间printf("\nError:Insert position is beyond the arrange.\n");return ERROR;}p = 1;//标志新元素应该插入的位置if (M->tu == 0){//插入前矩阵M没有非零元素M->data[p].i = row;M->data[p].j = col;M->data[p].e = e;M->tu++;return OK;}for (t = 1; t <= M->tu; t++)//寻找合适的插入位置if ((row >= M->data[t].i) && (col >= M->data[t].j))p++;if (row == M->data[t - 1].i && col == M->data[t - 1].j){//插入前,该元素已经存在M->data[t - 1].e = e;return OK;}for (i = M->tu; i >= p; i--){//移动p之后的元素M->data[i + 1].i = M->data[i].i;M->data[i + 1].j = M->data[i].j;M->data[i + 1].e = M->data[i].e;}//插入新元素M->data[p].i = row;M->data[p].j = col;M->data[p].e = e;M->tu++;return OK;}Status FindElem(const TSMatrix *M, int row, int col, ElemType *e){//查找三元组表示的稀疏矩阵M中,第 row 行,第 col列元素,若不为0,//则用e返回其值,并返回TRUE,否则返回FALSEint p;for (p = 1; p <= M->tu; p++)if (M->data[p].i == row&&M->data[p].j == col){*e = M->data[p].e;return TRUE;}return FALSE;}Status TransposeSMatrix(const TSMatrix *M, TSMatrix *T){//采用三元组表存储表示,求稀疏矩阵M的转置矩阵Tint col, p, q;T->mu = M->nu; T->nu = M->mu; T->tu = M->tu;if (T->tu){q = 1;for (col = 1; col <= M->mu; col++)for (p = 1; p <= M->tu; p++)if (M->data[p].j == col){T->data[q].i = M->data[p].j;T->data[q].j = M->data[p].i;T->data[q].e = M->data[p].e;q++;}}return OK;}Status FastTransposeSMatrix(const TSMatrix *M, TSMatrix *T){//利用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵Tint col, t, p, q, *num, *cpot;T->mu = M->nu; T->nu = M->mu; T->tu = M->tu;if (T->tu){num = (int *)malloc(sizeof(int)*M->tu);cpot = (int *)malloc(sizeof(int)*M->tu);if (!(num&&cpot)){printf("Apply for memory error.\n");exit(0);}for (col = 1; col <= M->nu; col++) num[col] = 0;//求M中每一列含有非零元素的个数for (t = 1; t <= M->tu; t++) ++num[M->data[t].j];cpot[1] = 1;//求第col列中第一个非零元素在b.data中的序号for (col = 2; col <= M->nu; col++)cpot[col] = cpot[col - 1] + num[col - 1];for (p = 1; p <= M->tu; p++){col = M->data[p].j; q = cpot[col];T->data[q].i = M->data[p].j;T->data[q].j = M->data[p].i;T->data[q].e = M->data[q].e;++cpot[col];}//for}//ifreturn OK;}Status MultSMatrix(const TSMatrix *M, const TSMatrix *T, TSMatrix *Q){//稀疏矩阵的乘法,如果符合乘法规则,Q返回M*T结果,并返回OK,否则返回ERRORint i, j, k, p;ElemType m, t, s;if (M->nu != T->mu){printf("Sorry,these two matrice can‘t multiply.\n");return ERROR;}Q->mu = M->mu; Q->nu = T->nu; Q->tu = 0;p = 1;for (i = 1; i <= Q->mu; i++){for (j = 1; j <= Q->nu; j++){s = 0;for (k = 1; k <= M->nu; k++){if (FALSE == FindElem(M, i, k, &m))continue;if (FALSE == FindElem(T, k, j, &t))continue;s += m*t;}if (s != 0){//Q[i][j]非零Q->data[p].i = i;Q->data[p].j = j;Q->data[p].e = s;p++;Q->tu++;}}}return OK;}void PrintSMatrix(const TSMatrix *M){//打印稀疏矩阵所有元素int i, j, p = 1;printf("\nsize:%d × %d\n", M->mu, M->nu);if (!M->tu){//0矩阵printf("%g\n", 0.0);return;}for (i = 1; i <= M->mu; i++){for (j = 1; j <= M->nu; j++){if (i == M->data[p].i && j == M->data[p].j){printf("%g\t", M->data[p].e);p++;}else{printf("%g\t", 0.0);}}printf("\n");}printf("\n");}
原文:http://www.cnblogs.com/zhuzhenfeng/p/4626664.html