文档介绍:数组
数组是一种特殊的线性表,表中的元素可以是原子类型,也可以是一个线性表。本节主要介绍数组的定义和数组的抽象数据类型。
第1页/共50页
数组的定义
数组是由n个类型相同的数据元素组成的有限序列。其中,这n个数据元素占用一块地址连续的存储空间。数组中的数据元素可以是原子类型的,如整型、字符型、浮点型等,这种类型的数组称为一维数组;也可以是一个线性表,这种类型的数组称为二维数组。二维数组可以看成是线性表的线性表。
第2页/共50页
数组的抽象数据类型
1.数据对象集合
2.基本操作集合
第3页/共50页
数组的顺序表示与实现
一般情况下,不对数组进行插入和删除操作。如果建立了数组,则数组的维数与各维的长度不再改变,因此,数组采用的是顺序存储方式。本节的主要学习内容包括数组的顺序存储结构及顺序存储结构下的操作实现。
第4页/共50页
数组的顺序存储结构
在计算机中,存储器的结构是一维(线性)的结构。数组是一个多维的结构,如果要将一个多维的结构存放在一个一维的存储单元里,就必须先将多维的数组转换成一个一维的线性序列,才能将其存放在存储器中。
第5页/共50页
数组的顺序存储结构
数组的顺序存储结构类型定义描述如下:
#define MaxArraySize 3
#include<> /*标准头文件,包含va_start、va-arg、va_end宏定义*/
typedef struct
{
DataType *base; /*数组元素的基地址*/
int dim; /*数组的维数*/
int *bounds; /*数组的每一维之间的界限的地址*/
int *constants; /*数组存储映像常量基地址*/
}Array;
第6页/共50页
数组的基本运算
在顺序存储结构中,数组的基本运算实现如下所示。
(1)数组的初始化操作。
va_list的用法:             (1)首先在函数里定义一个va_list型的变量,这个变量是指向参数的指针;      (2)然后用va_start初始化变量刚定义的va_list变量,该函数的第二个参数是第一个可变参数的前一个参数,它是一个固定的参数;       (3)然后用va_arg返回可变的参数,va_arg的第二个参数是要返回的参数的类型;       (4)最后用va_end结束可变参数的获取。
第7页/共50页
数组的基本运算
(2)销毁数组操作。
void DestroyArray(Array *A)
/*销毁数组。将动态申请的内存单元释放*/
{
if(A->base)
free(A->base);
if(A->bounds)
free(A->bounds);
if(A->constants)
free(A->constants);
A->base=A->bounds=A->constants=NULL; /*将各个指针指向空*/
A->dim=0;
}
第8页/共50页
数组的基本运算
(3)返回数组中指定的元素。
int GetValue(DataType *e,Array A,…)
/*返回数组中指定的元素,将指定的数组的下标的元素赋值给e*/
{
va_list ap;
int offset;
va_start(ap,A);
if(LocateArray(A,ap,&offset)==0) /*找到元素在数组中的相对位置*/
return 0;
va_end(ap);
*e=*(+offset); /*将元素值赋值给e*/
return 1;
}
第9页/共50页
数组的基本运算
(4)数组的赋值操作。
int AssignValue(Array A,DataType e,...)
/*数组的赋值操作。将e的值赋给的指定的数组元素*/
{
va_list ap;
int offset;
va_start(ap,e);
if(LocateArray(A,ap,&offset)==0) /*找到元素在数组中的相对位置*/
return 0;
va_end(ap);
*(+offset)=e; /*将e赋