通用的二维数组

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);

时间: 2024-08-11 10:05:31

通用的二维数组的相关文章

一步一步教你用Swift开发俄罗斯方块:No.3 二维数组

数组是一个很有用的数据结构,很多程序都建立在数组之上,我很少看到哪个应用程序不用到数组的. 而我们的俄罗斯方块显然也需要数组,而且是更为特殊的  二维数组. 为什么是二维数组呢?其实我们的整个游戏区域,可以看做是一个二维数组区域,就像这样: 我们的每一个block都占据在这样一个20x10的区域之内,20行,10列的一个200个block的二维数组让我们可以根据(x,y)坐标来确定block的位置,而这些blocks其实就是组成我们的L形,或者Z形 等等不同但我们都熟知的俄罗斯方块: swift

数组指针与二维数组的寻址

引例:已知如下程序 1 #include <stdio.h> 2 main() 3 { 4 int x[3][4] = {1,3,5,7,9,11,2,4,6,8,10,12} ; 5 int (*p)[4] = x, k = 1, m, n = 0; 6 for(m=0; m < 2; m++) 7 n += *(*(p+m)+k); 8 printf("%d\n",n); 9 } 试写出程序的输出值.(虽然我很讨厌做这种笔头功夫的题,我也坚信编程语言是在实践中练出

二维数组名作为实参或者形参

    1.方式1.void fun(int a[4][6]); //二维数据作为函数参数时,要明确指明二维数组的列数.         void fun(int a[][6])    //二维数组行数可以省略         另外,不能用非常量定义二维数组作为其下标.     */ void fun1(int a[][3],int n){//数组的行数    for (int i = 0; i < n; i++) {        for (int j = 0; j < 3; j++) { 

二维数组元素的地址

一维数组元素的地址大家都比较容易理解,但对于二维数组,就很容易搞混了.今天我又被这个问题给弄糊涂了,翻了翻老谭的书本,对这个问题有了更深的认识. 首先给出一个二维数组a,它的定义为: int a[3][4] = {{1,3,5,7}, {9,11,13,15}, {17,19,21,23}}; a数组包含3个行元素,a[0],a[1],a[2].而每个行元素又是一个一维数组,它包含4个元素. 从二维数组的角度来看,a代表二维数组首元素的地址,现在的首元素不是简单的整型,而是由4个整型元素所组成的

指针、函数、二维数组之间的联系

1.传递数组指针 1 #include <stdio.h> 2 void output( int (*pa)[3], int n )//这个函数只能输出n行3列的二维数组 3 { 4 int i,j; 5 for( i=0;i<n;i++ ){ 6 for( j=0;j<3;j++ ) 7 printf("%d ", pa[i][j] ); 8 printf("\n"); 9 } 10 } 11 void main() 12 { 13 int

二维数组(扩展hash数组)以及json,严格模式,字符串的常用api

二维数组 数组中的每一个元素也是数组 ?var arr=[ [1,2,3], [4,5,6], [7,8,9], [1,2,3,4,5,6,7] ...]; 怎么遍历二维数组 var arr=[ [1,2,3], [4,5,6,7], [10,20,30,40,60,80] ]; for(var r=0;r<arr.length;r++){ for(var c=0;c<arr[r].length;c++){ console.log(arr[r][c]); } } 怎么访问二维数组中的元素 ar

14-高效求最长公共子序列(二维数组存不下)

/*                                   See LCS again时间限制:1000 ms  |  内存限制:65535 KB难度:3 描述 There are A, B two sequences, the number of elements in the sequence is n.m; Each element in the sequence are different and less than 100000. Calculate the length

java基础:java中的二维数组

二维数组的概念: 一个元素为一维数组的数组. 格式1: 数据类型[][] 数组名 = new 数据类型[m][n]; m:表示这个二维数组有多少个一维数组. n:表示每一个一维数组的元素有多少个. 注意: A:以下格式也可以表示二维数组 a:数据类型 数组名[][] = new 数据类型[m][n]; b:数据类型[] 数组名[] = new 数据类型[m][n]; B:注意下面定义的区别 int x; int y; int x,y; int[] x; int[] y[]; int[] x,y[

二维数组

int[][]arr; arr=new int[5][6];//定义二维数组 int [][]grade=new int [5][6]//直接定义 for each循环:不使用下表就能访问: int=[]mum={12345} for(int a :m){ System.out.print(a)}  //num数组  a 12345;