1、问题描述
写一个(通用)二维数组的工具,可以按照数组的下标访问数组元素;
算法思路:实际上我们是申请一个一维数组,通过定义一些函数,让使用者"感觉"其使用的是二维数组甚至是多维数组;
其数据结构的控制头为:
typedef struct MATRIX{
USER_TYPE *data;
int maxRow;
int maxCol;
}MATRIX;
2、通用二维数组的实现
(1)、commonMatrix.h
#ifndef _COMMON_MATRIX_H_
#define _COMMON_MATRIX_H_
#include<malloc.h>
typedef unsigned char boolean;
typedef struct MATRIX{
USER_TYPE *data;
int maxRow;
int maxCol;
}MATRIX;
#define TRUE 1
#define FALSE 0
void initMatrix(MATRIX **matrixHead, int maxRow, int maxCol);
void destoryMatrix(MATRIX **matrixHead);
boolean setElementAt(MATRIX matrix, int row, int col, USER_TYPE value);
boolean getElementAt(MATRIX matrix, int row, int col, USER_TYPE *value);
boolean getElementAt(MATRIX matrix, int row, int col, USER_TYPE *value){
if(row < 0 || col < 0 || row >= matrix.maxRow || col >= matrix.maxCol){
return FALSE;
}
*value = matrix.data[row*matrix.maxCol + col];
return TRUE;
}
boolean setElementAt(MATRIX matrix, int row, int col, USER_TYPE value){
if(row < 0 || col < 0 || row >= matrix.maxRow || col >= matrix.maxCol){
return FALSE;
}
matrix.data[row*matrix.maxCol + col] = value;
return TRUE;
}
void destoryMatrix(MATRIX **matrixHead){
if(*matrixHead == NULL){
return;
}
if((*matrixHead)->data != NULL){
free((*matrixHead)->data);
}
free(*matrixHead);
*matrixHead = NULL;
}
void initMatrix(MATRIX **matrixHead, int maxRow, int maxCol){
MATRIX *matrix = NULL;
if(*matrixHead != NULL || maxRow <= 0 || maxCol <= 0){
return;
}
matrix = (MATRIX *)calloc(sizeof(MATRIX), 1);
matrix->maxRow = maxRow;
matrix->maxCol = maxCol;
matrix->data = (USER_TYPE *)calloc(sizeof(USER_TYPE), maxRow * maxCol);
*matrixHead = matrix;
}
#endif
(2)、commonMatrix.c
#include<stdio.h>
typedef int USER_TYPE; //用户自定义数据类型
//利用数据结构与算法的思想,做出了通用二维数组的工具,可以避开二维数组行、列长度不定的问题
#include"./commonMatrix.h"
void main(void){
MATRIX *matrix = NULL;
int maxRow;
int maxCol;
int value;
printf("请输入二维数组的行、列: ");
scanf("%d%d", &maxRow, &maxCol);
initMatrix(&matrix, maxRow, maxCol);
setElementAt(*matrix, 1, 1, 2); //用户的做自己返回时检测
getElementAt(*matrix, 1, 1, &value); //用户的做自己返回时检测
printf("matrix[1][1] = %d\n", value);
destoryMatrix(&matrix);
}
3、结果截图
4、算法分析
(1)、二维数组的本质是一位数组;
(2)、解决了长度不定的问题;
(3)、在对操作时,关键是数组下标的定位;
(4)、a[i] <==> *(a+i);
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。