小白眼中的线性表
一、想要学习线性表,先要准确掌握线性表的定义:
线性表(list):零个或多个数据元素的有限序列。
这里强调的有两点
- 线性表是一个序列,那么你就要问了,什么是序列,维基百科上说,序列是被排成一列的对象(或事件);这样,每个元素不是在其他元素之前,就是在其他元素之后。你可以这样简单的理解,线性表是一个序列,元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素只有一个前驱和一个后继。
- 线性表是有限的(这个是废话,根本不用写大家也知道)。
- 数据元素类型相同。你不能在同一个线性表中,既存数字,又存字母。
例如:
上面这张图片就是一个线性表,为什么呢?套定义,首先,他是一个序列,其次,他有限。这里,线性表元素的个数n定义为线性表的长度,当n=0时,称为空表。
二、线性表的相关操作
- 初始化操作
- 判断线性表是否为空
- 将线性表清空
- 将线性表中的指定位置元素进行返回
- 查找指定元素在线性表中的位置
- 在线性表的指定位置插入元素
- 删除线性表中指定位置的元素,并返回删除元素
- 返回线性表中的元素个数
当然,以上操作是最基本的,对于实际问题中,对线性表的更复杂的操作,完全可以用基本操作的组合来实现。
比如,在《大话数据结构》中说,要实现两个线性表集合A和B的并集操作,该怎么办?很简单对吧,我们先把集合B中的元素依次拿出来,然后调用基本操作,在集合A中进行查找,如果集合A中有该元素,什么都不做,如果集合A中没有该元素,则将该元素插入到集合A中,简不简单?这个功能我们之后会实现。
三、线性表的顺序存储结构
我们一直说的线性表,在数据结构中,其实是属于逻辑结构,也就是他只是我们逻辑上想出来的,并不是真的存储在电脑上的。那么你就要问了,我们如何把自己脑子里想的这条线,完完整整的存储在电脑里呢?好,我们先来看看物理存储结构的第一种—-顺序存储结构。
- 线性表的顺序存储结构定义:指的是用一段地址连续的存储单元依次存储线性表的数据元素。说到这里,我想有过一点点编程经验的同学,已经反应过来了,一段地址连续的存储单元,这不就是数组吗?是的,就是数组。线性表的顺序存储示意图如下:
- 线性表顺序存储结构代码
#define MAXSIZE 20 /*定义数组长度*/
typedef int ElemType; /*定义数据元素类型*/
typedef struct{
ElemType data[MAXSIZE]; /*定义数组*/
int length; /*定义线性表长度,注意线性表长度与数组长度是不同的*/
}SqList;
在这里,我想强调一下,关于数组的问题。我们玩看代码,猜程序运行结果好不好?
int data[20];
data[0] = 666;
printf("%d \n", data);//你猜输出了什么?
printf("%d \n", data[0]);//你猜输出了什么?
printf("%d \n", &(data[0]));//你猜输出了什么?与第一个输出一致吗?
如果你搞懂了上述输出,那么继续看
int data[20];
//data[0] = 666;
*(data) = 666;
*(data + 1) = 888;
printf("%d \n", data[0]);//你猜输出了什么?
printf("%d \n", data[1]);//你猜输出了什么?
printf("%d \n", *data);//你猜输出了什么?
printf("%d \n", *(data+1));//你猜输出了什么?
如果你懂了上述的代码,我想你应该看出来一些东西了。
- 声明数组data[20],其中,data其实是一个指针变量,存的是第一个数据元素的地址。
- data[0]其实是缩写,与*data可以互换。也就是通过data这个地址可以改变数组中的任何一个数据元素的值。