设计算法并编程实现用三元组顺序表解决稀疏矩阵的转置问题,第一种方法是普通的方法,也就是书上给出的方法,这不是一种高效的算法,下面给出代码和解释,其中注释已经解释的很清楚了。还有一种快速转置方法,将在我下一篇文章介绍
#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 条评论