📄 稀疏矩阵转置.c
字号:
#include<stdio.h>
#define MAXSIZE 100 /* 非零元个数的最大值 */
typedef struct triple
{
int i,j; /* 行下标,列下标 */
int e; /* 非零元素值 */
}triple;
typedef struct tsmatrix
{
triple data[MAXSIZE+1]; /* 非零元三元组表,data[0]未用 */
int mu,nu,tu; /* 矩阵的行数、列数和非零元个数 */
/* 各列第一个非零元的位置表rpos[0]未用 */
}rlsmatrix;
createsmatrix(rlsmatrix *M)
{ /* 创建稀疏矩阵M */
int e,i,m,n;
M->data[0].i=0; /* 为以下比较顺序做准备 */
printf("Please enter the matrix rows, columns, and the number of non-zero elements:\n"); /*输入矩阵的行数,列数,和非零元素的个数*/
scanf("%d",&M->mu);scanf("%d",&M->nu);scanf("%d",&M->tu);
for(i=1;i<=M->tu;i++)
{
printf("please input the non-zero element's row, column and value in row order\n",i,M->mu,M->nu);
scanf("%d",&m);scanf("%d",&n);scanf("%d",&e);
if(m<1||m>M->mu||n<1||n>M->nu) /*行或列超出范围 */
{printf("Rows or columns out of range!\n");getch();exit();}
if(m<M->data[i-1].i||m==M->data[i-1].i&&n<=M->data[i-1].j) /*行或列的顺序有错*/
{printf("Rows or columns in the order is wrong!\n");getch();exit();}
M->data[i].i=m;
M->data[i].j=n;
M->data[i].e=e;
}
}
/* 求矩阵的快速转置 */
void transposesmatrix(rlsmatrix M,rlsmatrix *T)
{ /* cpos存放每列的第一个非零元素的地址,temp中间变量 */
int i,m,*cpos,*temp,k=0;
T->mu=M.nu;
T->nu=M.mu;
T->tu=M.tu;
cpos=(int *)malloc(M.mu*sizeof(int));
if(cpos==NULL)exit();
temp=(int *)malloc(M.mu*sizeof(int));
if(temp==NULL)exit();
/* 对cpos对初始化,初值为0 */
*(cpos+1)=0;
for(i=1;i<=M.nu;i++)
{
for(m=1;m<=M.tu;m++)
{
if(M.data[m].j==i)
k++;
}
temp[i]=k;
if(i==1&&k!=0)
*(cpos+i)=1;/* 为cpos赋值 */
if(i>1)
*(cpos+i)=*(temp+i-1)+1;
}
free(temp);
for(i=1;i<=M.tu;i++)/* 进行转置 */
{T->data[*(cpos+M.data[i].j)].i=M.data[i].j;
T->data[*(cpos+M.data[i].j)].j=M.data[i].i;
T->data[*(cpos+M.data[i].j)].e=M.data[i].e;
(*(cpos+M.data[i].j))++;}
free(cpos);
}
void printmatrix(rlsmatrix M)/*输出 */
{
int i,m=1,n,k;
printf("Matrix's simplified model is:\n");
for(i=1;i<=M.tu;i++)
printf("%d,%d,%d\n",M.data[i].i,M.data[i].j,M.data[i].e);
printf("The number of matrix's rows is:%d\n",M.mu);
printf("The number of matrix's column is:%d\n",M.nu);
printf("Number of non-zero elements in the matrix is:%d\n",M.tu);
printf("The matrix is:\n");
for(n=1;n<=M.mu;n++)
{
printf("|");
for(k=1;k<=M.nu;k++)
{
if(M.data[m].i==n&&M.data[m].j==k)
{printf("%3d",M.data[m].e);
m++;}
else
printf(" 0");
}
printf(" |\n");
}
return;
}
void main()
{
rlsmatrix M,N;
printf("Please input matrix M\n");
createsmatrix(&M);
printmatrix(M);
getch();
printf("M carried out on the matrix transpose!");getch();
transposesmatrix(M,&N);
printf("The matrix after transpose is\n");
printmatrix(N);
getch();
}
/*说明:矩阵元素为整型值*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -