首页 > 编程语言 > 详细

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

时间:2015-03-13 14:29:19      阅读:323      评论:0      收藏:0      [点我收藏+]

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

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

// 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;
}
技术分享

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

原文:http://blog.csdn.net/fuming0210sc/article/details/44239323

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!