【背景】
编写一个C语言程序,实现将m行n列的矩阵A转置为B,即行列互换;
(本题取自2016年广西师范大学硕士研究生招生考试试题编程题部分)
【源码运行环境】
操作系统:Windows 10
编译环境:Dev C++(基于C99标准)
【思路】
在题干中,我们了解到,这是一个矩阵转置的C语言实现。于是我们直观地理解成,是否可以用一个二维数组表示成一个矩阵,届时可以直接针对二维数组进行值的对换。
但,在实际操作中,受制于C语言标准不同。(部分编译器不支持动态划定数组长度,以及二维数组参数传递等相关限制等。)导致我们在具体实现该程序时受阻重重。
(当然,我们在考试过程中,只需根据实现思路将伪代码写出即可,不需考虑这些限制)
本着打破砂锅问到底的原则,在碰了一系列壁之后。本文给出其中一种实现。思路如下:
1、不使用传统二维数组进行表示,而转换成结构体进行表示矩阵(利用C语言特性,便于参数传递);
2、根据定义的结构体,书写具体需求的函数。
【源码实现】
#include <stdio.h> /* * 结构体:DoubleArray * 作用:封装一个二维数组表示矩阵。 * Author: WellLEE * 最后一次修改时间:2018年12月8日 14:29:12 */ typedef struct DoubleArray{ int *column; }D_array; /* * 结构体:matrix * 作用:封装矩阵模型 * Author: WellLEE * 最后一次修改时间:2018年12月8日 14:29:30 */ typedef struct matrx{ D_array *array; int col_length; int row_length; }Matrix; /* *方法名:InitMatrix *作用:初始化矩阵 *参数:待初始化矩阵头指针 m, 二维数组头指针, 矩阵行数 row,矩阵列数 col i *返回值:void *Author: WellLee *最后一次修改时间:2018年12月8日 14:26:25 */ void InitMatrix(Matrix *m,int *array_1, int row, int col) { m->array = (D_array *)malloc(row * sizeof(D_array)); m->col_length = col; m->row_length = row; int i,j; for(i = 0; i < col; i++) { m->array[i].column = (int *)malloc(col * sizeof(int)); } for(i=0; i < row; i++) { for(j=0; j < col; j++) { m->array[i].column[j] = *(array_1 + i * col + j); } } } /* *方法名:TransformMatrix *作用:矩阵转置实现 *参数:待初转置矩阵头指针 m, 新矩阵(转置后)头指针b; *返回值:void *Author: WellLee *最后一次修改时间:2018年12月8日 14:26:25 */ void TransformMatrix(Matrix *m,Matrix *b) { b->array = (D_array *)malloc(m->col_length * sizeof(D_array)); b->row_length = m->col_length; b->col_length = m->row_length; int i,j; for(i = 0; i < m->col_length; i++) { b->array[i].column = (int *)malloc(m->row_length * sizeof(int)); for(j = 0 ; j < m->row_length; j++) { b->array[i].column[j] = m->array[j].column[i]; } } } /* *方法名:ShowMatrix *作用:规范化输出(显示)矩阵内容 *参数:待初转置矩阵头指针 m; *返回值:void *Author: WellLee *最后一次修改时间:2018年12月8日 14:27:54 */ void ShowMatrix(Matrix *m) { printf("矩阵信息如下:\n"); int i=0; int j=0; for(i = 0; i < m->row_length; i++) { for(j = 0; j < m->col_length; j++) { printf("%d ", m->array[i].column[j]); } printf("\n"); } } int main() { Matrix m; Matrix b; int a[][4] = {{1,3,5,7},{2,4,6,8},{3,6,9,5},{11,33,45,77}}; InitMatrix(&m,(int *)a,4,4); ShowMatrix(&m); TransformMatrix(&m, &b); ShowMatrix(&b); return 0; }
【总结】
作者在传统的C语言课堂上学习的知识不够透彻,对指针的理解有待加强。
【参考文献】
-
《数据结构习题解析与实验指导》.李冬梅,张琪.人民邮电出版社
-
广西师范大学2016年硕士研究生招生考试《806/826 数据结构》试题