数据结构第五章:数组和广义表

之前的线性结构的数据构成特点:

  • 线性表的数据构成:原子类型数据对象
  • 栈和队列的数据构成:原子类型的数据对象
  • 串的数据构成:字符

实际上,线性结构可以包含更广泛的数据类型:

  • 可以是原子类型的数据对象;
  • 可以是结构类型的数据对象;
  • 可以是混合类型的数据—广义表

1 数组的类型定义

1.一维数组
一维数组可看成是一个线性表或一个向量,存储在一块连续的存储单元中,适合于随机查找。一维数组记为A[n]或A=(a0,al,…ai,…,an-1) ,一维数组中ai的存储地址LOC(ai)可由下式求出:
LOC(ai)=LOC(a0)+i*L (0≤i<n)
2.二维数组
二维数组,又称矩阵(matrix)。每个元素又是一个定长的线性表(一维数组),都要受到两个关系即行关系和列关系的约束,也就是每个元素都同属于两个线性表。例如,设A是一个有m行n列的二维数组,A可以看成由m个行向量组成的向量,也可以看由n个列向量组成的向量。
在这里插入图片描述
一个二维数组可以看作是每个数据元素类型相都同的一维数组。以此类推,任何多维数组都可以看作一个线性表,这时线性表中的每个数据元素也是一个线性表。多维数组是特殊的线性表,是线性表的推广。
数组的性质:
(1) 数组中数据元素数目固定。一旦定义了一个数组,其数据元素数目不再有增减变化,属于静态分配存储空间的数据结构。
(2) 数组中数据元素必须具有相同的数据类型。
(3) 数组中每个数据元素都有一组唯一的下标值。在这里插入图片描述
(4)数组是一种随机存取结构,可随机存取数组中的任意数据元素。
(5)对于数组的操作一般只有两类:获得特定位置的元素值和修改特定位置的元素值。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2 数组的顺序表示和实现

数组的特点:
1)只有引用型操作,没有加工型操作;
2)数组是多维结构,存储空间是一维结构。
两种顺序映象方式:
1)以行序为主序(低下标优先);
2)以列序为主序(高下标优先);

以“行序为主序”的存储映象
在这里插入图片描述
“行序为主序” 即 “低下标优先”
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
【例5-1】对于给定的二维数组float a[ 3 ][ 4 ],计算:
(1) 数组a中的数组元素数目;
(2)若数组a的起始地址为1000,且每个数组元素长度为32位(即4个字节),数组元素a[2][3]的内存地址。
【解】(1)由于C语言中数组的行、列下标值的下界均为0,该数组行上界为3-1=2,列上界为4-1=3,所以该数组的元素数目共有34=12个。
(2)由于C语言采用行序为主序的存储方式,有:
LOC(a2,3)=LOC(a0,0)+(i
n+j)k
=1000+(2
4+3)*4
=1044
在这里插入图片描述
按上述两种方式顺序存储的数组,只要知道开始结点的存放地址(即基地址),维数和每维的上、下界,以及每个数组元素所占用的单元数,就可以将数组元素的存放地址表示为其下标的线性函数。因此,数组中的任一元素可以在相同的时间内存取,即顺序存储的数组是一个随机存取结构。
数据类型描述

typedef int ElemType;
typedef struct {
   
	ElemType  *base;//数组元素基址
	int  dim;//数组维数
	int  *bounds;//数组维长
	int  *constants;//常数因子
}Array;
//初始化数组
Status InitArray(Array *A, int dim, ...){
   
	if (dim<1||dim>MAX_ARRAY_DIM)
	{
   
		return ERROR;
	}
	A->dim = dim;
	A->bounds = (int *)malloc(dim*sizeof(int));
	int elemtotal = 1;
	va_list ap;
	va_start(ap, dim);
	for (int i = 0; i < dim; i++)
	{
   
		A->bounds[i] = va_arg(ap, int);
		elemtotal *= A->bounds[i];
	}
	va_end(ap);

	A->base = (int *)malloc(sizeof(int)*elemtotal);
	A->constants = (int *)malloc(dim*sizeof(int));
	A->constants[dim - 1] = 1;

	for (int i = dim-2; i >= 0; i--)
	{
   
		A->constants[i] = A->constants[i + 1] * A->constants[i + 1];
	}
	return OK;
}
//销毁数组
Status Destory(Array *A){
   
	if (!A->base)
	{
   
		return OK;
	}
	free(A->base);
	A->base = NULL;
	if (!A->bounds)
	{
   
		return OK;
	}
	free(A->bounds);
	A->bounds = NULL;
	if (!A->constants)
	{
   
		return OK;
	}
	f
  • 12
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值