用指针操作实现一个二维数组的转置运算。
输入:输入包含m + 1行。第一行是整数m和n,两项之间用一个空格隔开(1 <= m, n <= 10)。 其中,m,n分别为数组的行数和列数。第二行到第m + 1行每行均有n个整数,相邻两项之间用一个空格隔开。
输出:包含n行,是转置后的二维数组。每行均有m个整数,相邻两项之间用一个空格隔开。
例:【输入】3 2【回车】
1 2【回车】
4 5【回车】
7 8【回车】
【输出】1 4 7【回车】
2 5 8
@ada; 解答一下
可以让一个一维int指向指向二维数组第一个int元素,然后根据二维数组之间元素的位置关系,使用int指针来输出二维数组转置后的结果。
代码如下:
#include <stdio.h>
int main(void){
int m,n;
scanf("%d%d",&m,&n); // 获取行m,列n的值
// printf("m=%d,n=%d\n",m,n);
int arr[m][n]; // 创建m行n列的int数组
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
scanf("%d",&arr[i][j]);
}
}
// printf("读取到的数据为:\n");
// for(int i=0;i<m;i++){
// for(int j=0;j<n;j++){
// printf("%d ",arr[i][j]);
// }
// printf("\n");
// }
//
int * p = &arr[0][0]; // 让一维int指针指向二维数组第一个元素
int result[n][m]; // 存储转置后的二维数组
// 转置二维数组
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
result[i][j]=*(p+j*n+i);
}
}
// 输出转置后的结果
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(j!=m-1){ // 如果不是最后一个元素,则输出数字后,再输出一个空格
printf("%d ",result[i][j]);
}else{ // 如果到数组最后一个数字,则输出数字后输出一个换行
printf("%d\n",result[i][j]);
}
}
}
return 0;
}
供参考:
#include <stdio.h>
#define M 11 //行
#define N 11 //列
int main()
{
int m, n, i, j, a[M][N], b[N][M], * pa = a[0], * pb = b[0];
scanf("%d%d", &m, &n);
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
scanf("%d", &a[i][j]);
for (i = 0; i < m; i++) // 转置
for (j = 0; j < n; j++)
*(pb + j * M + i) = *(pa + i * N + j);
for (i = 0; i < n; i++) // 输出
{
for (j = 0; j < m; j++)
printf(j ? " %d" : "%d", b[i][j]);
printf("\n");
}
return 0;
}