Warning: Undefined array key "HTTP_ACCEPT_LANGUAGE" in /www/wwwroot/blog/wp-content/plugins/UEditor-KityFormula-for-wordpress/main.php on line 13
【数据结构】C语言实现矩阵转置 – Machine World

【背景】

编写一个C语言程序,实现将m行n列的矩阵A转置为B,即行列互换;

(本题取自2016年广西师范大学硕士研究生招生考试试题编程题部分)

【源码运行环境】

操作系统:Windows 10

编译环境:Dev C++(基于C99标准)

【思路】

在题干中,我们了解到,这是一个矩阵转置的C语言实现。于是我们直观地理解成,是否可以用一个二维数组表示成一个矩阵,届时可以直接针对二维数组进行值的对换。

但,在实际操作中,受制于C语言标准不同。(部分编译器不支持动态划定数组长度,以及二维数组参数传递等相关限制等。)导致我们在具体实现该程序时受阻重重。

(当然,我们在考试过程中,只需根据实现思路将伪代码写出即可,不需考虑这些限制)

本着打破砂锅问到底的原则,在碰了一系列壁之后。本文给出其中一种实现。思路如下:

1、不使用传统二维数组进行表示,而转换成结构体进行表示矩阵(利用C语言特性,便于参数传递);

2、根据定义的结构体,书写具体需求的函数。

【源码实现】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#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 数据结构》试题

作者 WellLee

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注