whu acm e1060
Description
输入一个矩阵,输出其转置矩阵。
要求:
1. 程序中不允许使用数组下标运算符。矩阵的空间使用malloc()分配,详见hint。
对于二维数组,需要先分配一个指针数组,然后再给指针数组中的每个指针分配int数组空间。
2. 分配的空间应当在每组数据处理结束后使用free()释放,应当先释放每一个int数组,
然后再释放指针数组。
Input
输入包含多组数据,处理到输入结束为止(EOF标志)。
每组输入首先是两个正整数 M, N (M, N都不大于20)
然后是M行,每行N个整数,使用空格分隔。
Output
输出其转置矩阵,数字间用空格分隔,行末最后一个整数后也输出空格。
Sample Input
2 3
1 2 3
4 5 6
Sample Output
1 4
2 5
3 6
Hint
1. malloc函数位于stdlib.h中,用于向操作系统申请一块内存(动态分配内存),其原型为:
void* malloc(int size);
参数size用于指定需要申请的内存大小;返回值为一个指针,指向分配到的内存。
如果内存分配失败,函数的返回值为NULL,因此分配到内存后需要判断返回值。
例:分配一个包含n个元素的int数组
int *a = (int *) malloc(sizeof(int) * n); ///* 返回值需要强制类型转换
if (a == NULL) exit(1); //* 内存分配失败则结束程序,或另作处理
2. free函数也位于stdlib.h中,用于释放动态分配到的内存,其原型为
void free(void *ptr);
申请到的内存不再使用以后,应当及时释放。
3. 为一个int"二维数组"分配空间,首先应当分配一个int *指针的数组
int **matrix = (int **) malloc(sizeof(int *) * M);
然后再为每一个int *指针分配相应的int数组
for (i = 0; i < M; i++)
*(matrix + i) = (int *) malloc(sizeof(int) * N);
然后才能用matrix[i][j]去访问/修改数据。实际上这个"二维数组"每一行是分布在内存中的不同位置,并不是连续存储的。
注意:本题要求不使用数组下标运算符,所以需要改成用指针来操作。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int m,n;
while(scanf("%d%d",&m,&n) != EOF) {
// printf("m=%d, n=%d\n",m,n);
int **p_arr = NULL;
p_arr = (int **)malloc(m*sizeof(int *));
if(NULL == p_arr) {
printf("memory is not enough, exit 0!\n");
break;
}
int i;
for(i=0;i<m;i++) {
*(p_arr+i) = (int *)malloc(n*sizeof(int));
if(NULL == *(p_arr+i)) {
printf("memory is not enough, exit 1!\n");
break;
}
}
int j;
for(i=0;i<m;i++) {
for(j=0;j<n;j++) {
// scanf("%d",&p_arr[i][j]);
scanf("%d",*(p_arr+i)+j);
}
}
for(j=0;j<n;j++) {
for(i=0;i<m;i++) {
// printf("%d\t",p_arr[i][j]);
printf("%d\t",*(*(p_arr+i)+j));
}
printf("\n");
}
// 00 01 02
// 10 11 12
// for(i=0;i<m;i++) {
// for(j=0;j<n;j++) {
//// printf("%d ",p_arr[i][j]);
// printf("%d\t",*(*(p_arr+i)+j));
// }
// printf("\n");
// }
for(i=0;i<m;i++) {
free(*(p_arr+i));
}
free(p_arr);
}
return 0;
}