稀疏矩阵
#include<stdio.h> #include<stdlib.h> #include<malloc.h> #define MAX 100 typedef struct{ int data[MAX][MAX]; int m,n; }matrix;//一个普通矩阵 typedef int spmatrix[MAX][3];//稀疏矩阵三元组表示法 //一个普通矩阵的初始化 void init(matrix*p,int m,int n) { p->m=m; p->n=n; } //普通矩阵转换为稀疏矩阵 void compressmatrix(matrix A,spmatrix B) { int i,j,k=1; for(i=0;i<A.m;i++) for(j=0;j<A.n;j++) if(A.data[i][j]!=0) { B[k][0]=i; B[k][1]=j; B[k][2]=A.data[i][j]; k++; } B[0][0]=A.m; B[0][1]=A.n; B[0][2]=k-1; } //稀疏矩阵转置 void transpmatrix(spmatrix B,spmatrix C) { int i,j,t,m,n; int x[MAX]; int y[MAX]; m=B[0][0];n=B[0][1];t=B[0][2]; C[0][0]=n;C[0][1]=m;C[0][2]=t; if(t>0) { for(i=0;i<n;i++)x[i]=0; for(i=1;i<=t;i++)x[B[i][1]]++; y[0]=1; for(i=1;i<n;i++)y[i]=y[i-1]+x[i-1]; for(i=1;i<=t;i++) { j=y[B[i][1]]; C[j][0]=B[i][1]; C[j][1]=B[i][0]; C[j][2]=B[i][2]; y[B[i][1]]=j+1; } } }
输入输出相关
//普通矩阵输入 void Mat_input(matrix *p) { int i,j,lm=p->m,ln=p->n; for(i=0;i<lm;i++) for(j=0;j<ln;j++) scanf("%d",&p->data[i][j]); } //普通矩阵输出 void Mat_output(matrix *p) { int i,j,lm=p->m,ln=p->n; for(i=0;i<lm;i++) { for(j=0;j<ln;j++) printf("%4d",p->data[i][j]); printf(" "); } } //稀疏矩阵三元组显示 void SpMat_output(spmatrix A) { int i,len=A[0][2]; for(i=0;i<=len;i++) printf("%d %d %d ",A[i][0],A[i][1],A[i][2]); printf(" "); } //根据稀疏矩阵三元组输出稀疏矩阵 void SpMat_display(spmatrix A) { int temp[MAX][MAX]={0}; int i,j,lm=A[0][0],ln=A[0][1],lsum=A[0][2]; for(i=1;i<=lsum;i++) temp[A[i][0]][A[i][1]]=A[i][2]; for(i=0;i<lm;i++) { for(j=0;j<ln;j++) printf("%4d",temp[i][j]); printf(" "); } printf(" "); }
测试:
int main() { matrix m,*pm=&m; spmatrix sp1; init(pm,3,3); Mat_input(pm); Mat_output(pm); compressmatrix(m,sp1); SpMat_output(sp1); SpMat_display(sp1); }
版权声明:本文为博主原创文章,未经博主允许不得转载。