数据结构——第4章 数组与广义表(1)

文章详细阐述了数组的逻辑结构,强调了数组作为数据结构的特性,以及在内存中的映像方式。对于一维、二维和三维数组,分别讨论了它们的内存分配原则,例如二维数组以行为主序。此外,还提供了一个寻找二维数组鞍点的示例代码。
摘要由CSDN通过智能技术生成

1.数组的逻辑结构

数组是我们熟悉的一种存储结构,除了实现线性表的顺序存储结构之后,其实际应用非常广泛。数组作为一种数据结构,其特点是结构中的元素本身可以具有某种结构的数据,但属于同一数据类型。比如,一维数组可以看作线性表,二维数组可以看作“数据元素是线性表”的一维数组,三维数组可以看作“数据元素是二维数组”的一维数组,依此类推,因此数组可以看作线性表的扩展。
数组是一个具有固定格式和数量的数据有序集,每一个数据元素有唯一的一组下标来标识,因此,在数组不适合做插入、删除数据元素的操作。在数组中通常执行下面两种操作:

  • 取值操作:给定一组下标,读其对应的数据元素值。
  • 赋值操作:给定一组下标,存储或修改与其对应的数据元素。

2.数组的内存映像

不同的程序设计语言对数组的存储空间分配的原则是不一样的,有的是“以行为主序”,有的是“以列为主序”。
以C语言为例,二维数组的内存分配原则是“以行为主序”,每一行是一个一维数组,所有行首尾相连也是一个一维数组,因为内存的地址空间是一维的,数组的行列固定后,通过一个映像函数,即可根据数组元素的下标得到它的存储地址。

2.1.一维数组的内存映像

一维数组的内存映像是按数组元素位序先后分配的一片连续存储空间。

2.2.二维数组的内存映像

寻找二维数组的鞍点(行最小,列最大)

void saddle(int A[], int n, int m)
{
	int i, j;
	int min;
	int col=0;
	for (i = 0; i < n; i++)
	{
		min = *(A + i * m);
		for (j = 0; j < m; j++)
		{
			if (min > *(A + i * m + j))
			{
				int tmp = min;
				min = *(A + i * m + j);
				*(A + i * m + j) = tmp;
				col = j;
			}
		}
		int k = 0;
		for (k = 0; k < m; k++)
		{
			if (min < *(A + k * m + col))
				break;
		}
		if (k == m)
			printf("%d\n", min);
	}
}

2.3.三维数组的内存映像

三维数组有三个维度,第一个维度表示页向量,第二个维度表示行向量,第三个维度表示列向量。
C语言中的三维数组内存映像是先按页、再按行为主序分配的一片连续的内存空间。
M * N * P的长度,找到位置元素的关系*(起始地址+i * N * P+j * p+k)* sizeof(元素字节的大小)。
结论:任何一个高维数组都可按一维数组使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰深入学习计算机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值