导航

数组的实现和一些基本操作

Posted on 2015-09-24 23:42  CSU蛋李  阅读(531)  评论(0编辑  收藏  举报

头文件:

#include<cstdarg>//标准头文件,提供宏va_start,va_arg和va_end,用于存取变长参数表
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define MYOVERFLOW -2
typedef int Status;
typedef int Elemtype;//用指定标识符Elemtype代表int类型,顾名思义表示元素类型为int型
#define MAX_ARRAY_DIM 8//假设数组维数的最大值为8
typedef struct{
    Elemtype *base;      //数组元素基址,由InitArray分配
    int dim;             //数组维数
    int *bounds;         //数组维界基址,有InitArray分配
    int *constants;      //数组映像函数常量基址,由InitArray分配
}Array;

//-----------------基本操作的函数原型说明-------------------

Status InitArray(Array &A, int dim, ...);
//若数组维数dim和各维长度合法,则构造相应的数组A,并返回OK。

Status DestroyArray(Array &A);
//销毁数组A。

Status Locate(Array A, va_list ap, int &off);
//若ap指示的各下标值合法,则求出该元素在A中相对地址off

Status Value(Array A, Elemtype &e,int dim, ...);
//A是n维数组,e为元素变量,随后是n个下标值
//若各下标不超界,则e赋值为所指定的A的元素值,并返回OK

Status Assign(Array &A, Elemtype e,int dim, ...);
//A是n为数组,e为元素变量,随后是n个下标值
//若各下标不超界,将e的值赋给所指定的A的元素值,并返回OK

上述操作的实现:

#include"stdafx.h"
Status InitArray(Array &A, int dim, ...)
//若数组维数dim和各维长度合法,则构造相应的数组A,并返回OK。
{
    if (dim<1 || dim>MAX_ARRAY_DIM) return ERROR;
    A.dim = dim;
    A.bounds = (int *)malloc(dim*sizeof(int));
    if (!A.bounds)exit(MYOVERFLOW);
    int elemtotal = 1;
    va_list ap;
    va_start(ap, dim);//ap为va_list类型,是存放变长参数表信息的数组
    for (int i = 0; i < dim; ++i){
        A.bounds[i] = va_arg(ap, int);
        if (A.bounds[i] < 0)return ERROR;
        elemtotal *= A.bounds[i];
    }
    va_end(ap);
    A.base = (Elemtype*)malloc(elemtotal*sizeof(Elemtype));
    if (!A.base)exit(MYOVERFLOW);
    //求映像函数的常数C(i),并存入A.constants[i-1],i=1,...,dim
    A.constants = (int *)malloc(dim*sizeof(int));
    if (!A.constants)exit(MYOVERFLOW);
    A.constants[dim - 1] = 1;//L=1,指针的增减以元素的大小为单位
    for (int i = dim - 2; i >= 0; --i)
        A.constants[i] = A.bounds[i + 1] * A.constants[i + 1];
    return OK;
}

Status DestroyArray(Array &A)
//销毁数组A。
{
    if (!A.base)return ERROR;
    free(A.base);
    A.base = NULL;
    if (!A.bounds)return ERROR;
    free(A.bounds);
    A.bounds = NULL;
    if (!A.constants)return ERROR;
    free(A.constants);
    A.constants = NULL;
    return OK;
}

Status Locate(Array A, va_list ap, int &off)
//若ap指示的各下标值合法,则求出该元素在A中相对地址off
{
    off = 0;
    for (int i = 0; i < A.dim; ++i){
        int ind = va_arg(ap, int);
        if (ind < 0 || ind >= A.bounds[i])return MYOVERFLOW;
        off += A.constants[i] * ind;
        
    }
    return OK;
}

Status Value(Array A, Elemtype &e,int dim, ...)
//A是n维数组,e为元素变量,随后是n个下标值
//若各下标不超界,则e赋值为所指定的A的元素值,并返回OK
{
    va_list ap;
    va_start(ap, dim);
    int off,result;
    if (result = Locate(A, ap, off) <= 0)return result;
    e = *(A.base + off);
    return OK;
}

Status Assign(Array &A, Elemtype e,int dim, ...)
//A是n为数组,e为元素变量,随后是n个下标值
//若各下标不超界,将e的值赋给所指定的A的元素值,并返回OK
{
    va_list ap;
    va_start(ap, dim);
    int result, off;
    if ((result = Locate(A, ap, off)) <= 0)return result;
    *(A.base + off) = e;
    return OK;
}

主函数:

// Array.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
    Array arr;
    InitArray(arr, 2, 2, 3);
    Assign(arr, 100,2, 1, 2);
    Elemtype e;
    Value(arr, e,2, 1, 2);
    cout << e << endl;
    return 0;
}

结果: