njithjw的个人空间 https://blog.eetop.cn/505866 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

whu_acm e1060

已有 543 次阅读| 2016-11-13 22:25 |个人分类:c|系统分类:芯片设计


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;

}


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 2

    粉丝
  • 0

    好友
  • 0

    获赞
  • 17

    评论
  • 3512

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-29 17:05 , Processed in 0.027770 second(s), 15 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部