//////////////////////////////////////////// //稀疏矩阵的算法 模式匹配 // //三元组算法 // //Author:Wang Yong // //Date: 2010.8.19 // //////////////////////////////////////////// #include <stdio.h> #include <stdlib.h> #define MAX 1000 //矩阵中非0元素的个数 typedef int ElemType; //////////////////////////////////////////// //定义三元组 typedef struct { int row,col; //非零元素的行号列号 ElemType e; //非零元素的值 }Triple; //定义三元组表 typedef struct { Triple data[MAX+1]; //三元组的表,data[0]未用 int m,n,num; //矩阵的行数,列数和非零元素个数 }TSMatrix; //////////////////////////////////////////////// //三元组表的创建 void CreatTSMatrix( TSMatrix &M) { printf("请输入稀疏矩阵的行数:"); scanf("%d",&M.m); printf("请输入稀疏矩阵的列数:"); scanf("%d",&M.n); printf("请输入矩阵中非零元素的个数:"); scanf("%d",&M.num); int i; for(i = 1; i <= M.num; i++) { printf("请输入第%d个元素的行号和列号及其元素的值:",i); scanf("%d %d %d",&M.data[i].row,&M.data[i].col,&M.data[i].e); } } ////////////////////////////////////////////// //三元组的快速转置 TSMatrix FastTransMatrix(TSMatrix A,TSMatrix &B) { int number[MAX]; int position[MAX]; int i,j,temp; B.m = A.n; B.n = A.m; B.num = A.num; if(A.num) { for(j = 0; j < A.n;j++) //矩阵A每一列非零元素的个数初始化 number[j] = 0; for(i = 1 ; i <= A.num;i++) //求矩阵中的每一列的非零元素个数 number[A.data[i].col]++; position[0] = 1; //position[i]为第i列第一个元素在B.data中的位置 for(j = 1 ; j < A.n; j++) //求A.data的第j列第一个非零元素在B.data中的序号 position[j] = position[j-1] + number[j-1]; //求转置矩阵B的三元组表 for(i = 1 ; i <= A.num;i++) { j = A.data[i].col; temp = position[j]; B.data[temp].row = A.data[i].col; B.data[temp].col = A.data[i].row; B.data[temp].e = A.data[i].e; position[j]++;//第j列上后续元素的位置 } } return B; } //输出稀疏矩阵 void Output(TSMatrix M) { int i,j; int cnt = 1; int e = 0; for(i = 0; i < M.m;i++) { for(j = 0; j < M.n;j++) { if(i == M.data[cnt].row && j == M.data[cnt].col) { printf("%5d",M.data[cnt].e); ++cnt; } else printf("%5d",e); } printf("\n"); } } /////////////////////////////////////////// // 输出三元组表 void Print(TSMatrix M) { int i; printf("{"); for(i = 1; i <= M.num;i++) { printf("( %d, %d, %d) ",M.data[i].row,M.data[i].col,M.data[i].e); } printf("}"); } ////////////////////////////////////////////////// int main() { TSMatrix M,N; CreatTSMatrix(M); Output(M); Print(M); printf("\n"); FastTransMatrix(M,N); Output(N); Print(N); printf("\n"); return 0; }