www.pudn.com > datastructor.rar > SparseMatrix.c
#include#include #define MAXSIZE 125 typedef enum {ERROR = -2,OVERLOW,FALSE, TRUE, OK} Status; typedef int ElemType; typedef struct{ int i, j; //该非零元的行下标和列下标 ElemType e; }Triple; typedef struct{ Triple data[MAXSIZE+1];//非零元三元组表,data[0]未用 int mu, nu, tu; //矩阵的行数、列数和非零个数 }TSMatrix; /****************Member function*****************/ Status CreateSMatrix(TSMatrix* M, int (*arr)[], int row, int col){ //postcondition: 创建稀疏矩阵M int m, n, k = 1; M->mu = row; M->nu = col; for(m = 0; m < row; ++m){ for(n = 0; n < col; ++n){ if((*arr)[m*col+n] != 0){ M->data[k].i = m; M->data[k].j = n; M->data[k].e = (*arr)[m*col+n]; ++M->tu; ++k; } } } return OK; } Status DestroySMatrix(TSMatrix* M){ //precondition: 稀疏矩阵M存在 //postcondition: 销毁稀疏矩阵M } Status PrintSMatrix(const TSMatrix* M){ //precondition: 稀疏矩阵M存在 //postcondition: 输出稀疏矩阵M int m, n, k = 1; for(m = 0; m < M->mu; ++m){ for(n = 0; n < M->nu; ++n){ if(M->data[k].i == m && M->data[k].j == n){ printf("%3d", M->data[k].e); ++k; } else printf("%3d", 0); } printf("\n"); } return OK; } Status CopySMatrix(const TSMatrix* M, TSMatrix* T){ //precondition: 稀疏矩阵M存在 //postcondition: 由稀疏矩阵M复制得到T T->mu = M->mu; T->nu = M->nu; T->tu = M->tu; int n; for(n = 0; n <= MAXSIZE; ++n) T->data[n] = M->data[n]; return OK; } Status AddSMatrix(const TSMatrix* M, const TSMatrix* N, TSMatrix* Q){ //precondition: 稀疏矩阵M与N的行数和列数对应相等 //postcondition: 求稀疏矩阵的和Q=M+N } Status SubtMatrix(const TSMatrix* M, const TSMatrix* N, TSMatrix* Q){ //precondition: 稀疏矩阵M与N的行数和列数对应相等 //postcondition: 求稀疏矩阵的差Q=M-N } Status MultSMatrix(const TSMatrix* M, const TSMatrix* N, TSMatrix* Q){ //precondition: 稀疏矩阵M的列数等于N的行数 //postcondition: 求稀疏矩阵乘积Q=M*N } Status TransposeSMatrix(const TSMatrix* M, TSMatrix* T){ //precondition: 稀疏矩阵M存在 //postcondition: 求稀疏矩阵M的转置矩阵T T->mu = M->nu; T->nu = M->mu; T->tu = M->tu; if(T->tu){ int col, p, q = 1; for(col = 0; col <= M->nu; ++col) for(p = 0; 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){ T->mu = M->nu; T->nu = M->mu; T->tu = M->tu; if(T->tu){ int col, num[20] = {0}, cpot[20] = {0}; //for(col = 1; col <= M->tu; ++col) num[col] = 0; int t; for(t = 1; t <= M->tu; ++t) ++num[M->data[t].j];num[t+1] = 1; for(t =0; t<7; ++t) printf("%3d",num[t]);printf("%3d",num[t]); cpot[1] = 1; for(col = 2; col <= M->nu; ++col){ cpot[col] = cpot[col-1] + num[col-1]; //printf("%3d", cpot[col]); } int p, q; printf("Here is OK!\n"); 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[p].e; ++cpot[col]; } } return OK; } /****************************main()**************************/ int main() { int array[6][7] = { {0, 12,9, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {-3,0, 0, 0, 0, 14,0}, {0, 0, 24,0, 0, 0, 0}, {0, 18,0, 0, 0, 0, 0}, {15,0, 0,-7, 0, 0, 0} }; TSMatrix array1, array2; CreateSMatrix(&array1, array, 6, 7); printf("The matrix:\n"); PrintSMatrix(&array1); /* int ss; for(ss = 1; ss <= array1.tu; ++ss) printf("(%d, %d, %d)\n", array1.data[ss].i, array1.data[ss].j, array1.data[ss].e); */ TransposeSMatrix(&array1, &array2); printf("\nTranspose matrix:\n"); PrintSMatrix(&array2); /* for(ss = 1; ss <= array2.tu; ++ss) printf("(%d, %d, %d)\n", array2.data[ss].i, array2.data[ss].j, array2.data[ss].e); */ printf("Copy matrix:\n"); CopySMatrix(&array1, &array2); PrintSMatrix(&array2); TSMatrix array3; printf("Fast Transpose matrix:\n"); FastTransposeSMatrix(&array1, &array3); PrintSMatrix(&array3); //printf("%d %d %d\n", array1.mu, array1.nu, array1.tu); //printf("%d %d %d\n", array2.mu, array2.nu, array2.tu); int nm; for(nm = 1; nm <= array1.tu; ++nm) printf("(%d, %2d, %2d)\n", array1.data[nm].i, array1.data[nm].j, array1.data[nm].e); system("pause"); return 0; }