多维数组的存储表示与实现--自己写数据结构

国际惯例,直接上代码

文件multiarray.h存放数据结构体,如下:

#ifndef _MULTIARRAY_H_
#define _MULTIARRAY_H_

#define MAX_DIM  10
#include <stdarg.h> 

typedef struct _MArray
{
    int *base;   //基址
    int dim;      //维度
    int *bounds;  //存放没个维度大小的头指针
    int *wide;     //存放每个维度偏移常量的头指针
}MArray,*pMArray;

pMArray init_multi_array(void);
int set_multi_array(pMArray pma,int dim,...);
void destory_multi_array(pMArray pma);
int locate_array_elem(pMArray pma,va_list ap,int *offset) ;
int get_array_elem(int* e,pMArray pma,...);
int assign_array_elem(int e,pMArray pma,...);

#endif

文件multiarray.c存放数据结构实现方法,如下:

/*******************************
时间:2014.12.14
作者:XIAO_PING_PING
编译环境:DEV-C++ 4.9.9.2
内容:多维数组的存储表示与实现
功能:学习些数据结构
********************************/

#include <string.h>
#include <stdlib.h>

#include "multiarray.h"

/*初始化一个空的数组*/
pMArray init_multi_array(void)/*注意:必须以返回值输出,
                               否则后面给成员赋值会报错*/
{
    pMArray pma;
    pma = (MArray *)malloc(sizeof(MArray));

    pma->base = NULL;
    pma->bounds = NULL;
    pma->wide = NULL;
    pma->dim = 0;    

    return pma;
}

/*设置多维数组*/
int set_multi_array(pMArray p,int dims,...)
{
    int i,elem_num = 1;
    va_list ap = NULL;

    if(dims < 1 || dims > MAX_DIM)
    {
        return -2;
    }
    p->dim = dims;
    p->bounds = (int *)malloc(dims * sizeof(int));

    if(!p->bounds)
    {
        return -1;
    }

    va_start(ap,dims);
    for(i = 0;i < dims;i++)
    {
        p->bounds[i] = va_arg(ap,int);
        if(p->bounds[i] < 0)
        {
            return -2;
        }
        elem_num *= p->bounds[i];
    }
    va_end(ap);

    p->base = (int *)malloc(elem_num * sizeof(int));
    if(p->base == NULL)
    {
        return -2;
    }

    p->wide = (int *)malloc(dims * sizeof(int));
    if(!p->wide)
    {
        return -1;
    }

    p->wide[dims - 1] = 1;
    for(i = dims - 2;i >= 0;i--)
    {
        p->wide[i] = p->wide[i + 1] * p->bounds[i + 1];
    }

    return 0;
}

/*摧毁多维数组*/
void destory_multi_array(pMArray pma)
{
    if(NULL != pma->wide)
    {
        free(pma->wide);
        pma->wide = NULL;
    }      

    if(NULL != pma->bounds)
    {
        free(pma->bounds);
        pma->bounds = NULL;
    }   

    if(NULL != pma->base)
    {
        free(pma->base);
        pma->base = NULL;
    } 

    free(pma);
}

/*定位元素a[i][j][k]...位置*/
int locate_array_elem(pMArray pma,va_list ap,int *offset)
{
    int i;
    int cur = 0;

    for(i = 0;i < pma->dim ;i++)
    {
        cur = va_arg(ap,int);
        if(0 > cur || cur > pma->bounds[i])
        {
            return -1;
        }

        *offset += pma->wide[i] * cur;
    }

    return 0;
}

/*得到多维数组特定位置的元素*/
int get_array_elem(int* e,pMArray pma,...)
{
    int i;
    int offset = 0;
    int ret = 0;
    va_list ap = NULL;

    va_start(ap,pma);
    if(0 != locate_array_elem(pma,ap,&offset))
    {
        return -1;
    }
    va_end(ap);

    *e = *(pma->base + offset);

    return 0;
}

/*给多维数组特定位置赋值*/
int assign_array_elem(int e,pMArray pma,...)
{
    int offset = 0;
    int ret = 0;   

    va_list ap = NULL;

    va_start(ap,pma);

    ret = locate_array_elem(pma,ap,&offset);
    if(ret)
    {
        return -1;
    }
    va_end(ap);

    *(pma->base + offset) = e;
    return 0;
}

测试文件test.c

#include <conio.h>
#include <stdlib.h>
#include <string.h>

#include "multiarray.h"

int main()
{
    pMArray arr;  

    int dim = 3;  

    int bound1 = 2, bound2 = 3, bound3 = 4; //arr[2][3][4]数组   

    int i = 0, j = 0, k = 0;  

    int assign_elem = 0;  

    int get_elem = 0;  

    int *p = NULL;  

    arr = init_multi_array();

    set_multi_array(arr, dim, bound1, bound2, bound3);  

    printf("array.bounds = ");          //顺序输出array.bounds   

    p = arr->bounds;  

    for(i = 0; i < dim; i++)  

    {  

        printf("%d ", *(p + i));  

    }  

    printf("\narray.contents = ");      //顺序输出array.contents   

    p = arr->wide;  

    for(i = 0; i < dim; i++)  

    {  

        printf("%d ", *(p + i));  

    }  

    printf("\narray[%d][%d][%d] : \n", bound1, bound2, bound3);  

    for(i = 0; i < bound1; i++)  

    {  

        for(j = 0; j < bound2; j++)  

        {  

            for(k = 0; k < bound3; k++)  

            {  

                assign_elem = i * 100 + j * 10 + k;  

                assign_array_elem(assign_elem, arr, i, j, k);  

                get_array_elem(&get_elem, arr, i, j, k);  

                printf("array[%d][%d][%d]=%-4d", i, j, k, get_elem);  

            }  

            printf("\n");  

        }  

        printf("\n");  

    }  

    p = arr->base;  

    for(i = 0; i < bound1 * bound2 * bound3; i++)  

    {  

        printf("%-4d", *(p + i));  

        if(i % (bound2 * bound3) == bound2 * bound3 - 1)  

        {  

            printf("\n");  

        }  

    }  

    destory_multi_array(arr);  

    getch(); 

    return 0;  

}

以及运行结果如下:

时间: 2024-11-14 18:41:06

多维数组的存储表示与实现--自己写数据结构的相关文章

C++学习笔记之由文本文件读取数据到vector模板建立的二维数组 并存储为新的文本文件

阅读本文可首先参考: C++学习笔记之输入.输出和文件 测试数据: 1 /*读取txt文件到二维数组*/ 2 #include <iostream> 3 #include <fstream> 4 #include <vector> 5 #include <string> 6 7 using namespace std; 8 9 typedef vector< vector<int> > D2array; //二维数组 10 typed

第三十四课 二维数组的存储 【项目1-3】

第三十四课 二维数组的存储 项目一[二维数组当函数参数] 定义一个函数来完成对参数数组中元素的求和工作,函数声明如下: [cpp] view plain copy print? int sum(int array[ ][4],int m,int n);  //该函数完成对array数组中的前m行和n列元素求和 在以下程序的基础上,完成对sum函数的定义. [cpp] view plain copy print? #include <stdio.h> int sum(int array[ ][4

串的堆分配存储表示与实现--自己写数据结构

本次实现的数据结构是关于串的表示与实现,首先讲串的堆分配存储表示与实现,后面的博客将贴出串的另外数据结构的表示和实现 heapstring.h文件存放数据结构体,如下 #ifndef _HEAPSRING_H_ #define _HEAPSRING_H_ typedef struct _HString { char *ch; int length; }HString,*pHString; pHString init_null_string(void); pHString init_heap_st

二级指针与二维数组

最近看<Linux C程序设计大全>这本书,虽然书中有一些错误,但整体来说,书写得还算可以. 当看到网络编程[第23.2.4小节 获得主机信息]时,遇到了一段代码,原文如下: “一台主机有许多和网络相关的信息,例如,主机名称.IP地址.主机提供的服务等.这些信息一般都保存在系统中的某个文件里(例如/etc/hosts等),用户程序可以通过系统提供的函数读取这些文件上的内容.Linux环境下使用gethostent函数读取和主机有关的信息,该函数的原型如下: 1 #include <net

将二维数组中的行列互换

情景:二维数组可以存储表格数据,还可以根据下标索引加入各种运算,而且图片的关键运算方法也是以二维数组为基础进行矩阵运算的. //创建二维数组 int arr[][] = new int[][]{{1,2,3},{4,5,6},{7,8,9}}; System.out.println("行列互掉前:"); //输出二维数组 printArray(arr); int arr2[][] = new int[arr.length][arr.length]; //调整数组行列数据 for (in

PHP - 多维数组

多维数组指的是包含一个或多个数组的数组. PHP 能理解两.三.四或五级甚至更多级的多维数组.不过,超过三级深的数组对于大多数人难于管理. 注释:数组的维度指示您需要选择元素的索引数. 对于二维数组,您需要两个索引来选取元素 对于三维数组,您需要三个索引来选取元素 PHP - 两维数组 两维数组是数组的数组(三维数组是数组的数组的数组). 首先,让我们看看下面的表格: 我们能够在两维数组中存储上表中的数据,就像这样: $cars = array ( array("Volvo",22,1

二维数组的认识及其表示元素的两种方式

/* ============================================================================ Name : TeatArr.c Author : lf Version : Copyright : Your copyright notice Description : 二维数组的认识以及其表示元素的两种方式 备注说明 1 要理解二维数组的存储方式. 2 实际上利用a[i][j]的方式并不"正统",这是这靠近我们的 常识一些

初学c课程笔记整理7--&gt;&gt;二维数组、字符串、指针

是什么?有什么用?用在什么地方?(理解) 养成良好的编程习惯; 培养编程思想: 写代码之前应该先分析需求,分析完需求再开始写代码:(写注释)   1.二维数组 1.1 二维数组的基本概念: 所谓多维数组就是一个一维数组的每个元素又被声明为一 维数组,从而构成二维数组. 可以说二维数组是特殊的一维数组. 示例 int a[2][3] 可以看作由一维数组a[0]和一维数组a[1]组成,这两个一维数组都包含了3个int类型的元素 1.2 二维数组的定义: 数组中的每一个元素又是一个数组, 那么这个数组

C语言二维数组

一 :二维数组 一维数组的每一个元素又是一个数组(数组的数组) int a[3][4],定义一个数组,有3个元素,a[0].a[1].a[2] a[0]  又是一个一维数组,有4个元素 二:二维数组的定义及注意 格式:数据类型   二维数组名[第一维的长度][第二维的长度] int arr[3][4]; 注意: 1)数组名不能和变量名重复 2)遵循标识符命名原则 3)数组的长度可以使用宏定义 4)数组的长度可以使用变量 int m,n; scanf("%d,%d",&m,&am