Machine World | Math World

记录实验过程

【数据结构】C语言实现矩阵转置

【背景】

编写一个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 数据结构》试题

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注