zoukankan      html  css  js  c++  java
  • 写一函数,将一个3*3的整型矩阵转置

    写一函数,将一个3x3的整型矩阵转置。

    解题思路: 矩阵转置就是行变列,列变行,说白了就是 arry[i][j] 转换为 arry[j][i] ; 但是需要注意的是,

    一. 因为行列个数可能并非相同,转换后行数或者列数变多了或者变少,因此不能直接转换。需要重新申请空间存储转换后的数据。

    二. 二维数组是线性扁平化存储的,无法确定列数的情况下传参后,在函数中使用时需要头指针向后偏移 列数*第n行 才能访问到第n行的数据。例如在函数中访问 arry[i][j] ,需要通过arry + col_num*i + j 方式进行访问。

    答案:

    #include <stdio.h>
    int **transform(int **arry, int row_count, int col_count)
    {
    	//列变行,行变列,则行的个数是以前列的个数,列的个数是以前行的个数
    	int **p = NULL;
        //矩阵中有多少行,取决于以前有多少列,然后申请地址空间
    	p = (int **)malloc(sizeof(int *) * col_count);
    	for (int i = 0; i < col_count; i++) {
            //一行中有多少列,取决于以前有多少行,然后申请空间
    		p[i] = (int *)malloc(sizeof(int) * row_count); 
    	}
    	for (int i = 0; i < col_count; i++) {
    		for (int j = 0; j < row_count; j++) {
                //二维数组的存储是扁平化的, 访问第j行第i列的数据,应该是 arry + j*列数 + i
                //j是新数组的列,但是是源数组的行
    			p[i][j] = (arry + col_count * j)[i]; 
    		}
    	}
    	return p;
    }
    int main()
    {
    	int arry[3][4];
    	printf("Please enter a 3 x 4 matrix: 
    ");
    	for (int i = 0; i < 3; i++) {
    		for (int j = 0; j < 4; j++) {
    			scanf_s("%d", &arry[i][j]);
    		} 
    	}
    	int **p = transform(arry, 3, 4);
    	printf("
    ");
    	for (int i = 0; i < 4; i++) {
    		for (int j = 0; j < 3; j++) {
    			printf("%d ", p[i][j]);
    		}
    		free(p[i]); // 释放二级指针中每个一级指针申请的空间
    		printf("
    ");
    	}
    	free(p);//释放总体二级指针的空间
    	system("pause");
    	return 0;
    }
    

    写一函数,将一个3*3的整型矩阵转置

  • 相关阅读:
    网络知识 ACL NAT IPv6
    const用法
    单向链表排序
    文件系统
    protel DXP的类矢量图功能
    proteus画元件
    SD卡FAT32文件系统格式
    如何实现一个malloc函数
    sbrk and coreleft
    windows下常用快捷键
  • 原文地址:https://www.cnblogs.com/weiyidedaan/p/13275410.html
Copyright © 2011-2022 走看看