数组的顺序表示和实现

define MAX_ARRAY_DIM 8//假设数组维数的最大值为8

typedef int ElemType;

struct Array

{

ElemType * base;//数组元素基址,由InitArray分配

int dim;//数组维数

int * bounds;//数组维界基址,由InitArray分配

int * constants;//数组映像函数常量基址,由InitArray分配

};

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

int elemtotal = 1, i;//elemtotal是数组元素总数,初值为1(累乘器)

va_list ap;//变长参数表类型,在stdarg.h中

if (dim < 1 || dim > MAX_ARRAY_DIM)//数组维数超出范围

return ERROR;

A.dim = dim;//数组维数

A.bounds = (int )malloc(dim sizeof (int));//动态分配数组维界基址

if (!A.bounds)

exit(OVERFLOW);

va_start(ap, dim);//变长参数“…”从形参dim之后开始

for (i = 0; i < dim; i++)

{

A.bounds[i] = va_arg(ap, int); //逐一将变长参数赋给A.bounds[i]

if (A.bounds < 0)

return UNDERFLOW;//在math.h中定义为4

elemtotal *= A.bounds[i];//数组元素总数 = 各维长度之乘积

}

va_end(ap);//结束提取变长参数

A.base = (ElemType )malloc(elemtotal sizeof(ElemType));//动态分配数组存储空间

if (!A.base)

exit(OVERFLOW);

A.constants = (int )malloc(dim sizeof(int));//动态分配数组偏移量基址

if (!A.constants)

exit(OVERFLOW);

A.constants[dim - 1] = 1;//最后一维的偏移量为1

for (i = dim - 2; i >= 0; –i)

A.constants[i] = A.bounds[i + 1] * A.constants[i - 1];//每一维的偏移量

return OK;

}

void DestroyArray(Array &A){//销毁数组A

if (A.base)

free(A.base);//释放A.base所指向的存储单元

if (A.bounds)

free(A.bounds);

if (A.constants)

free(A.constants);

A.base = A.bounds = A.constants = NULL;//使他们不再指向任何存储单元

A.dim = 0;

}

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

int i, ind;

off = 0;

for (i = 0; i < A.dim; i++)

{

ind = va_arg(ap, int);//逐一读取各维的下标值

if (ind < 0 || ind >= A.bounds[i])//各维的下标值不合法

return OVERFLOW;

off += A.constants[i] * ind;//相对地址 = 各维的下标值 * 本维的偏移量之和,

}

}

Status Value(ElemType &e, Array A, …){//”…”依次为各维的下标值,若各下标合法,则e被赋值为A的相应的元素值

va_list ap;//变长参数表类型,在stdarg.h中

int off;

va_start(ap, A);//变长参数”…”从形参A之后开始

if (Locate(A, ap, off) == OVERFLOW)//调用Locate(),求得变长参数所指单元的相对地址off

return ERROR;

e = *(A.base + off);//将变长参数所指单元的值赋给e

return OK;

}

Status Assign(Array A, ElemType e, …){//变量A的值不变,故不需要&,”…”依次为各维的下标值,若各下标合法,则将e的值赋给A的指定的元素

va_list ap;
int off;
va_start(ap, e);
if (Locate(A, ap, off) == OVERFLOW)
    return ERROR;
*(A.base + off) = e;//将e的值赋给变长参数所指单元
return OK;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 00:30:34

数组的顺序表示和实现的相关文章

基于动态分配的数组的顺序表(兼具Boost单元测试)

我们利用静态分配的数组来实现的顺序表的局限还是挺大的,主要在于它的容量是预先定好的,用户不能根据自己的需要来改变.如果为了后续用户能够自己调整顺序表的大小,动态地分配数组空间还是很有必要的.基于动态分配的数组的顺序表绝大部分跟基于静态分配的数组的顺序表是一样的,只需在后者程序上改动一小部分即可. 第一,我们不需定义一个容量常量CAPACITY,而是定义一个私有变量myCapacity. 第二,类的构造函数需要改进一下.我们需要类在被实例化时自动申请内存,即需添加下边程序: ElementType

js颠倒数组元素顺序reverse()

颠倒数组元素顺序reverse() reverse() 方法用于颠倒数组中元素的顺序. 语法: arrayObject.reverse() 注意:该方法会改变原来的数组,而不会创建新的数组. 定义数组myarr并赋值,然后颠倒其元素的顺序: <script type="text/javascript"> var myarr = new Array(3) myarr[0] = "1" myarr[1] = "2" myarr[2] =

将树形结构的数组按照顺序遍历为二维数组

/** * 将树形结构的数组按照顺序遍历为二维数组 * renxing,2015年8月7日 11:06:47 */ function arr_child ($array) { static $res; if (!is_array($array)) { return false; } foreach ($array as $k=>$v) { if (is_array($v) && isset($v['child'])) { $child = $v['child']; //将这个数组的子

基于静态分配的数组的顺序表(兼具Boost单元测试)

首先,我们来搞明白几个概念吧(参考自网站数据结构及百度百科). 线性表 线性表是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表的逻辑结构简单,便于实现和操作.在实现线性表数据元素的存储方面,一般可用顺序存储结构和链式存储结构两种方法. 顺序表 用顺序存储方法存储的线性表简称为顺序表(Sequential List).顺序表的存储方法是把线性表的结点按逻辑次序依次存放在一组地址连续的存储单元

一维数组打乱顺序shuffle函数

$shopObj = new ShopModel(); $this->data = $shopObj->field('id')->select(); //二维数组降一维 $this->data = $this->translatArray2($this->data); //一维数组打算顺序 shuffle($this->data); //长度4分割数组 $this->data = array_chunk($this->data,4); //查出随机的店

java算法面试题:有数组a[n],用java代码将数组元素顺序颠倒

package com.swift; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Array_Reverse { public static void main(String[] args) { /* * 有数组a[n],用java代码将数组元素顺序颠倒 */ int a[]={11,8,2,24,90,23}; //首先可以用集合的方法把数组元素颠倒

使用JAVA数组实现顺序栈

1,首先总结一下线性表(分为顺序表和链接表,[即顺序存储结构和链式存储结构的区别])和栈(顺序栈和链接栈)还有队列(顺序队列和链接队列)的JAVA类库中的实现: java.util.ArrayList 实现了顺序表,java.util.LinkedList 实现了链接表的功能. java.util.ArrayDeque实现了顺序栈和顺序队列(该类中即定义了与栈操作有关的方法,也定义了与队列操作有关的方法).java.util.LinkedList实现了链接栈和链接队列. 2,定义了一个Stack

使用JAVA数组实现顺序表

1,引入了JAVA泛型类,因此定义了一个Object[] 类型的数组,从而可以保存各种不同类型的对象. 2,默认构造方法创建了一个默认大小为16的Object数组:带参数的构造方法创建一个指定长度的Object数组 3,实现的顺序表的基本操作有:返回表的长度.获取指定索引处的元素(注意是索引,而不是位置.索引以下标0开始,位置以下标1开始).按值查找数据元素的位置.直接插入元素(顺序表尾部).向指定位置插入元素.直接删除元素(在顺序表尾部).删除指定索引处元素.判断表是否为空.清空表. 1 im

关联数组和顺序数组的应用场景

简而言之:   关联数组:   适用:根据给定的条件,即键值,快速搜索   不适用:排序,尤其对于维数较多的关联数组   eg: $arr[$key1][$key2][$key3] 根据$key3对该数组进行排序 顺序数组:   适用:排序   不适用:根据给定的条件,快速搜索 结论:应该根据条件选择合适类型的数组

数组--元素顺序反转

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 /* 7 练习7:将一个字符串数组的元素的顺序进行反转. 8 * {"3","a","8","haha"} 转换为{"haha","8","a","3"}