数组是 一种 使用广泛 的数据结构,任何编程语言都有数组。其本质上 是 线性表,一维数组 是 一个线性表,多维数组是多组 线性表。 其 便利性 就在于 查找 和 赋值 方便。所以 就没必要 用 链式存储方式。
下面 给出 数组的实现代码:
// 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; }
时间: 2024-10-23 11:13:31