很早以前写的程序了,今天上传一例,待整理成面向对象的封装结构,呵呵
将二维数组用三元组保存,然后调用三元组的转置方法,最后输出对应的二维数组
执行结果:
// 稀疏矩阵.cpp : Defines the entry point for the console application. @sonikk 2010-7-6 // #include "stdafx.h" #include <stdio.h> #include <malloc.h> //定义三元组顺序表 #define MAXSIZE 100 //非零元素最大值为100 #define MU 5 //行数 #define NU 5 //列数 #define NULL 0 struct Triple //---------------------------定义三元组结构体---------------------------- { int i,j; int e; }; struct TSMatrix { Triple data[MAXSIZE-1]; //非零元三元组表,data[0]未用 int mu; //行数 int nu; //列数 int tu; //非零元个数 }; //----------------------------------------------------------------------- int getMu() //得到数组行数 { return MU; } int getNu() //得到数组列数 { return NU; } int getTu(int a[][NU]) //得到数组非零元个数 { int i,j,count=0; for(i=0;i<MU;i++) for(j=0;j<NU;j++) if(a[i][j]!=0) count++; return count; } void changeTo3YZ(struct TSMatrix &m,int a[][NU]) //将二维数组转换成三元组 三元组的初始化 { int i,j,t=1; m.mu=getMu(); m.nu=getNu(); m.tu=getTu(a); for(i=0;i<MU;i++) for(j=0;j<NU;j++) { if(a[i][j]!=0) { m.data[t].i=i; m.data[t].j=j; m.data[t].e=a[i][j]; t++; } } } void outputArr(int a[][NU]) //输出二维数组 { int i,j; for(i=0;i<MU;i++,printf("\n")) for(j=0;j<NU;j++) { printf("%d ",a[i][j]); } } void output3YZ(TSMatrix &m) //输出三元组表 { int i; printf("\n三元组表为:\n"); for(i=1;i<=m.tu;i++) { printf("%d: %d %d %d\n",i,m.data[i].i,m.data[i].j,m.data[i].e); } printf("\n"); } void output2W(TSMatrix m) //将三元组输出成二维数组 { int i,j,k,putZero=1; printf("\n"); for(i=0;i<m.mu;i++) { for(j=0;j<m.nu;j++) { for(k=1;k<=m.tu;k++) { if(i==m.data[k].i && j==m.data[k].j) { printf("%d ",m.data[k].e); putZero=0; } } if(putZero) printf("0 "); putZero=1; } printf("\n"); } } void fastTransposeSMatrix(TSMatrix &t,TSMatrix m) //求三元组矩阵m的转置矩阵t { int *num,*cpot; int i,col,q; //col表示列 t.mu=m.mu; t.nu=m.nu; t.tu=m.tu; num=(int *)malloc(sizeof(int)*m.tu); //动态创建向量数组 cpot=(int *)malloc(sizeof(int)*m.tu); for(i=0;i<m.tu;i++) //全部归0 { *(num+i)=0; } if(m.tu) { for(i=0;i<m.tu;i++) { *(num+m.data[i+1].j)+=1; } for(i=0;i<m.tu;i++) { if(i==0) *(cpot+i)=1; else *(cpot+i) = *(num+i-1)+ *(cpot+i-1); } for(i=0;i<m.tu;i++) //递交 { col=m.data[i+1].j; q=*(cpot+col); t.data[q].i= m.data[i+1].j; t.data[q].j= m.data[i+1].i; t.data[q].e= m.data[i+1].e; *(cpot+col)+=1; } } free(num); free(cpot); } //定义二维数组 MU=NU=4 int matrix[MU][NU]= { {1,0,0,4}, {3,5}, {0,0,7,9}, {0,2}, {0,0,0,0,1} }; void main(int argc, char* argv[]) { TSMatrix m,t; //定义两个三元组矩阵,t为转置后的 outputArr(matrix); //输出二维数组 printf("\n非零元个数为:%d\n",getTu(matrix)); //输出非零元个数 changeTo3YZ(m,matrix); //将二维数组转换为三元组 output3YZ(m); //输出该三元组表 printf("\n调用转置方法...\n"); fastTransposeSMatrix(t,m); //将m转置后放到t output3YZ(t); //输出该三元组表 output2W(t); //输出转置后的二维数组 getchar(); }