序号与下标

在学习线性表操作的代码时,被索引问题搞晕了。线性表是1索引,而以前写代码用的数组时都是零索引,分不清该如何对待这两套系统。因此今天想写篇博客明确一下这两种基于不同数的所以方式到底该怎么使用来的好!

线性表的逻辑位序是从1开始,数组元素的下标从0开始,这是两个最基本原则,是前提!

线性表是一种抽象数据结构,是一种数学描述。我们可以通过用跟其有相同的“随机存取”特性的数组来表示它,用来描述其物理结构。所以,数组是一个实现的工具,而核心其实还在被实现的线性表上。一般来说,对待某个相关问题,首先是得出线性表层面操作的具体步骤,尔后再将其映射到数组操作的步骤。以下通过例题说明:

Example 1 线性表插入算法中的后移程序段
线性表的基本操作,它的描述是基于1索引的,在写代码时应该尽可能地去符合这个描述。比如这段代码的“在第i个位置插入元素”,这个i的取值便是[1,L.length].第一个有效范围判断的语句中,i的判断是与线性表1索引所对应,即i必须是1到L.length+1这个范围内.在有移动元素功能的loop中,判断条件也是从线性表的角度来说,即从最后一个元素开始,直到要插入元素的位置.对于移动元素,用线性表描述是“将第j个元素移到第j+1的位置上”,在这里结合数组零索引的特点,将j替换成j-1,就可以很好地解决了。在本题中,体现“线性表层面操作的步骤”有循环条件等,而数组的操作则是循环体里的赋值代码。实际上,这里面所有的i都是线性表的i,也是1索引的i,当数组需要时,将其减去1就可以非常好的解决它得是零索引的要求。这种做法最为简单。如果让i是零索引的,数组操作自然可以“L.data[j+1] = L.data[j]”,但从一开始的参数输入就得需要自己将原本想插入加一了,这样很不好。使用者不该去了解其是如何实现,而只关心如何使用,计算应该封装在函数内,这才是正确的做法。

#include<stdlib.h>
#include<stdio.h>
#define InitSize 100
#define len 10
// 顺序表定义
typedef struct {
	int *data;
	int length;
	int MaxSize;
}SqList;
// 顺序表初始化
void InitList(SqList &L) {
	L.data = (int *)malloc(sizeof(int) * InitSize);
	L.length = 0;
	L.MaxSize = InitSize;
}
// 顺序表插入
bool InsertElem(SqList &L,int i,int e) {
	if(i < 1 || i >	L.length+1) return false;
	if(L.length >= L.MaxSize) {
		// 如果存储满了,开辟更大的新空间
		int *p = L.data;
		L.data = (int *)malloc(sizeof(int) * (L.MaxSize + len));
		// 如果开辟空间失败,返回false
		if(L.data == NULL) return false;
		// 复制元素到新空间
		for(int j=0;j < L.length;j++) {
			L.data[j] = p[j];
		}
	}
	// 移动元素
	for(int j=L.length;j>=i;j--) {
		L.data[j] = L.data[j-1];
	}
	// 赋值
	L.data[i-1] = e;
	// 增长
	L.length += 1;
	printf("插入程序执行成功!");// 测试用
	return true;
}

Example 2:翻转一个数组(如图)
[.img]
当 1索引:
有a[1] a[2] a[3] a[4] a[5]
b[1] b[2] b[3] b[4] b[5]
len为b长度
将第一个元素值赋给数组倒数第一个元素,b[5] = a[1]
将第二个元素值赋给数组倒数第二个元素,b[4] = a[2]
将第三个元素值赋给数组倒数第三个元素,b[3] = a[3]

显然
对于a[i]与b[j],有i+j=len+1,即操作为b[len+1-i] = a[i]

当 0索引:
同理可得,
对于a[i]与b[j],有i+j=len-1,即操作为b[len-1-i]

索引的初始值从1到0,对于索引的数字而言,其实是对整体向后移动了一位,原来的首位索引发生改变。因此如果某公式涉及到首和尾,如此例中len不变,但从“正向第几个”变为“倒数第几个”,首尾对其有影响,对应结果出入就很大了。

posted on 2025-02-23 00:06  VoidHan21  阅读(28)  评论(0)    收藏  举报