数组是 一种 使用广泛 的数据结构,任何编程语言都有数组。其本质上 是 线性表,一维数组 是 一个线性表,多维数组是多组 线性表。 其 便利性 就在于 查找 和 赋值 方便。所以 就没必要 用 链式存储方式。
下面 给出 数组的实现代码:
// Array.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdlib.h>
#include <stdarg.h>
#define ARRAY_MAX_DIM 8//数组最大维度
typedef int ElementType;
enum E_STATE
{
E_STATE_ERROR = 0,
E_STATE_OK = 1,
};
struct Array
{
ElementType * base;
int dim;// 数组 是 几维数组
int * dimLenArray;//数组 每维 的 长度
int * dimBaseArray;//数组 每维 的 基数
};
E_STATE arrayInit(Array * array,int dim,...){
if (dim < 1 || dim > ARRAY_MAX_DIM)//维度错误
{
return E_STATE_ERROR;
}
array->dim = dim;
va_list ap;
va_start(ap,dim);
array->dimLenArray = (int *) malloc(sizeof(int) * dim);
if (array->dimLenArray == NULL){
va_end(ap);
return E_STATE_ERROR;
}
int totalNum = 1;
for (int i = 0; i < dim; i++){
int len = va_arg(ap,int);
if (len < 1)//长度 错误
{
va_end(ap);
return E_STATE_ERROR;
}
array->dimLenArray[i] = len;
totalNum *= len;
}
array->base = (ElementType *) malloc(sizeof(ElementType) * totalNum);
if (array->base == NULL)
{
free(array->dimLenArray);
array->dimLenArray = NULL;
va_end(ap);
return E_STATE_ERROR;
}
array->dimBaseArray = (int *) malloc(sizeof(int) * dim);
if (array->dimBaseArray == NULL)
{
free(array->dimLenArray);
array->dimLenArray = NULL;
free(array->base);
array->base = NULL;
va_end(ap);
return E_STATE_ERROR;
}
array->dimBaseArray[dim-1] = 1;
for (int i = dim - 2; i >= 0; i--)
{
array->dimBaseArray[i] = array->dimBaseArray[i+1] * array->dimLenArray[i+1];
}
va_end(ap);
return E_STATE_OK;
}
void arrayDestory(Array * array){
if (array->base)
{
free(array->base);
array->base = NULL;
}
if (array->dimBaseArray)
{
free(array->dimBaseArray);
array->dimBaseArray = NULL;
}
if (array->dimLenArray)
{
free(array->dimLenArray);
array->dimLenArray = NULL;
}
array->dim = 0;
}
//数组 索引 从 0 计算.. (0行 0 列 等等)
E_STATE arraylocation(Array array,va_list ap,int * off){
*off = 0;
for (int i = 0; i < array.dim; i++)
{
int dimLen = va_arg(ap,int);
if (dimLen < 0 || dimLen >= array.dimLenArray[i])
{
return E_STATE_ERROR;
}
*off += dimLen * array.dimBaseArray[i];
}
//printf("location = %d \n",*off);
return E_STATE_OK;
}
E_STATE arrayGetValue(Array array,ElementType * data,...){
int location = 0;
va_list ap;
va_start(ap,data);
if (arraylocation(array,ap,&location) == E_STATE_ERROR)
{
va_end(ap);
return E_STATE_ERROR;
}
*data = array.base[location];
va_end(ap);
return E_STATE_OK;
}
E_STATE arraySetValue(Array * array,ElementType data,...){
int location = 0;
va_list ap;
va_start(ap,data);
if (arraylocation(*array,ap,&location) == E_STATE_ERROR)
{
va_end(ap);
return E_STATE_ERROR;
}
array->base[location] = data;
va_end(ap);
return E_STATE_OK;
}
int _tmain(int argc, _TCHAR* argv[])
{
Array array;
//
arrayInit(&array,3,3,4,5);
int index1 = 1,index2 = 2,index3 =0;
for (; index3 < 5; index3++)
{
arraySetValue(&array,index3,index1,index2,index3);
}
for (index3 =0; index3 < 5; index3++)
{
int result = -1;
arrayGetValue(array,&result,index1,index2,index3);
printf("%d\n",result);
}
arrayDestory(&array);
return 0;
}