看数据结构写代码(19) 数组的实现

数组是 一种 使用广泛 的数据结构,任何编程语言都有数组。其本质上 是 线性表,一维数组 是 一个线性表,多维数组是多组 线性表。 其 便利性 就在于 查找 和 赋值 方便。所以 就没必要 用 链式存储方式。

下面 给出 数组的实现代码:

// 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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值