设计算法并编程实现用三元组顺序表解决稀疏矩阵的转置问题,第一种方法是普通的方法,也就是书上给出的方法,这不是一种高效的算法,下面给出代码和解释,其中注释已经解释的很清楚了。还有一种快速转置方法,将在我下一篇文章介绍
#include<stdio.h> #define M 6//行数 #define N 6//列数 #define Maxsize 8 typedef struct { int r;//行号 int c;//列号 int d;//元素值 }TupNode;//三元组类型 typedef struct { int rows;//行数 int cols;//列数 int num;//非零元个数 TupNode data[Maxsize];//非零元素的行列以及元素值的三元组信息 }TSMatrix;//三元表类,一个三元表相当于一个稀疏矩阵 void CreateMat(TSMatrix &t,int a[M][N])//创建一个三元表,从a数组里面获取数据 { int i,j; t.rows=M;t.cols=N;t.num=0;//初始化一张三元表 for(i=0;i<M;i++)//逐行扫描 { for(j=0;j<N;j++)//逐列扫描 { if(a[i][j]!=0) { t.data[t.num].r=i;//更新最大行数 t.data[t.num].c=j;//更新最大列数 t.data[t.num].d=a[i][j];//插入元素值 t.num++;//非零元素个数+1,因为是从0开始,所以只要执行if语句,个数就+1; } } } } void DispMat(TSMatrix t)//输出一个稀疏矩阵的三元表 { int k; if(t.num<=0) return;//没有非零元素时直接返回 printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.num);//表头:行数,列数,非零元素数 printf("\t---------------------------------\n"); for(k=0;k<t.num;k++)//输出每一个非零元素的三元信息 { printf("\t%d\t%d\t%d\n",t.data[k].r,t.data[k].c,t.data[k].d); } } void TranTat(TSMatrix t,TSMatrix &tb)//转置函数 { int k,k1=0,v; tb.rows=t.cols;//列数变行数 tb.cols=t.rows;//行数变列数 tb.num=t.num; if(t.num!=0) { for(v=0;v<t.cols;v++)//按列号从小到大排列 { for(k=0;k<t.num;k++)//扫描t的所有元素,看有没有符合t的列号等于v的元素 { if(t.data) { tb.data[k1].r=t.data[k].c; tb.data[k1].c=t.data[k].r; tb.data[k1].d=t.data[k].d; k1++; } } } } } void show(TSMatrix t) { int a[M][N]; int m,n,k; for (m=0;m<M;m++) { for(n=0;n<N;n++) { a[m][n]=0; } } for(k=0;k<t.num;k++) { n=t.data[k].c; m=t.data[k].r; a[m][n]=t.data[k].d; } for (m=0;m<M;m++) { for(n=0;n<N;n++) { printf("%3d",a[m][n]); } printf("\n"); } } int main() { int a[6][6]={{0,12,9,0,0,0},{0,0,0,0,0,0},{-3,0,0,0,0,0},{0,0,0,24,0,0} , {0,18,0,0,0,0},{15,0,0,-7,0,14}}; TSMatrix t,tb; CreateMat(t,a); printf("原矩阵三元表:\n"); DispMat(t); printf("矩阵为\n\n"); show(t); printf("转置后三元表\n"); TranTat(t,tb); DispMat(tb); printf("矩阵为\n\n"); show(tb); }
0 条评论