数据结构与算法中数组和广义表的稀疏矩阵的快速转置
#include<stdlib.h>
#include<stdio.h>
#define MAXSIZE 100
typedef struct{
int row ,col ;
int data ;
} Triple;
typedef struct{
Triple data[MAXSIZE+1];
int mu,nu,tu;
} TSMatrix;
TSMatrix M,T ;
void initarray(TSMatrix *A)
{
int i,j,e,p=0;
A->mu=0;
A->nu=0;
while(1)
{
printf("\n请输入矩阵节点的信息==>(行 列 值)(exit for -1):");
scanf("%d%d%d",&i,&j,&e);
if (i==-1) break;
if (p>MAXSIZE){
printf("\n空间满了.");
break;
}/*if*/
else {
A->data[++p].row=i;
A->data[p].col=j;
A->data[p].data=e;
A->mu =(A->mu > i)? A->mu :i ;
A->nu =( A->nu > j) ? A->nu :j ;
}/*else*/
}/*while*/
A->tu=p;
}/*initarray*/
void Print(TSMatrix *A)
{
int i;
printf("\n当前矩阵是==%d x %d, 数据是 %d",A->mu , A->nu , A->tu);
for(i=1;i<=A->tu ;++i)
printf("\n[%d , %d , %d ]",A->data[i].row,A->data[i].col,A->data[i].data);
printf("\n矩阵输出结束.");
}/*Print*/
void TransMatrix(TSMatrix *A ,TSMatrix *B)
{
int q , j , p ;
int num[MAXSIZE+1],cpot[MAXSIZE+1];
B->mu=A->nu ; B->nu=A->mu ; B->tu= A->tu;/*三元组的规模参数*/
if ( B->tu)
{
for(j=1; j<=A->nu ; ++j) num[j]=0;
for(p=1;p<=A->tu ; ++p) ++num[A->data[p].col]; /*求原数组中每一列含非零元素个数*/
cpot[1]=1;
for(j=2 ; j<=A->nu ; ++j) cpot[j]=cpot[j-1]+num[j-1];
for(p=1;p<=A->tu;++p)
{
j=A->data[p].col; /*取列号*/
q=cpot[j]; /*对应B表中各行的当前始址*/
B->data[q].row=A->data[p].col;
B->data[q].col=A->data[p].row;
B->data[q].data=A->data[p].data;
++cpot[j]; /*B表中对应行当前的始位置下移*/
}/*for*/
}/*if*/
}/*TransMatrix*/
int main()
{
initarray(&M);
Print(&M);
TransMatrix(&M,&T);
Print(&T);
system("pause");
exit(0);
}
运行结果:
请输入矩阵节点的信息==>(行 列 值)(exit for -1):1 2 12
请输入矩阵节点的信息==>(行 列 值)(exit for -1):1 3 9
请输入矩阵节点的信息==>(行 列 值)(exit for -1):3 1 -3
请输入矩阵节点的信息==>(行 列 值)(exit for -1):3 6 14
请输入矩阵节点的信息==>(行 列 值)(exit for -1):4 3 24
请输入矩阵节点的信息==>(行 列 值)(exit for -1):5 2 18
请输入矩阵节点的信息==>(行 列 值)(exit for -1):6 1 15
请输入矩阵节点的信息==>(行 列 值)(exit for -1):6 4 -7
请输入矩阵节点的信息==>(行 列 值)(exit for -1):-1 -1 -1
当前矩阵是==6 x 6, 数据是 8
[1 , 2 , 12 ]
[1 , 3 , 9 ]
[3 , 1 , -3 ]
[3 , 6 , 14 ]
[4 , 3 , 24 ]
[5 , 2 , 18 ]
[6 , 1 , 15 ]
[6 , 4 , -7 ]
矩阵输出结束.
当前矩阵是==6 x 6, 数据是 8
[1 , 3 , -3 ]
[1 , 6 , 15 ]
[2 , 1 , 12 ]
[2 , 5 , 18 ]
[3 , 1 , 9 ]
[3 , 4 , 24 ]
[4 , 6 , -7 ]
[6 , 3 , 14 ]
矩阵输出结束.请按任意键继续. . .