小白眼中的线性表(前篇)

小白眼中的线性表

一、想要学习线性表,先要准确掌握线性表的定义:
线性表(list):零个或多个数据元素的有限序列。
这里强调的有两点

  1. 线性表是一个序列,那么你就要问了,什么是序列,维基百科上说,序列是被排成一列的对象(或事件);这样,每个元素不是在其他元素之前,就是在其他元素之后。你可以这样简单的理解,线性表是一个序列,元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素只有一个前驱和一个后继。
  2. 线性表是有限的(这个是废话,根本不用写大家也知道)。
  3. 数据元素类型相同。你不能在同一个线性表中,既存数字,又存字母。

例如:
这里写图片描述
上面这张图片就是一个线性表,为什么呢?套定义,首先,他是一个序列,其次,他有限。这里,线性表元素的个数n定义为线性表的长度,当n=0时,称为空表

二、线性表的相关操作

  1. 初始化操作
  2. 判断线性表是否为空
  3. 将线性表清空
  4. 将线性表中的指定位置元素进行返回
  5. 查找指定元素在线性表中的位置
  6. 在线性表的指定位置插入元素
  7. 删除线性表中指定位置的元素,并返回删除元素
  8. 返回线性表中的元素个数

当然,以上操作是最基本的,对于实际问题中,对线性表的更复杂的操作,完全可以用基本操作的组合来实现。

比如,在《大话数据结构》中说,要实现两个线性表集合A和B的并集操作,该怎么办?很简单对吧,我们先把集合B中的元素依次拿出来,然后调用基本操作,在集合A中进行查找,如果集合A中有该元素,什么都不做,如果集合A中没有该元素,则将该元素插入到集合A中,简不简单?这个功能我们之后会实现。

三、线性表的顺序存储结构
我们一直说的线性表,在数据结构中,其实是属于逻辑结构,也就是他只是我们逻辑上想出来的,并不是真的存储在电脑上的。那么你就要问了,我们如何把自己脑子里想的这条线,完完整整的存储在电脑里呢?好,我们先来看看物理存储结构的第一种—-顺序存储结构。

  1. 线性表的顺序存储结构定义:指的是用一段地址连续的存储单元依次存储线性表的数据元素。说到这里,我想有过一点点编程经验的同学,已经反应过来了,一段地址连续的存储单元,这不就是数组吗?是的,就是数组。线性表的顺序存储示意图如下:
    这里写图片描述
  2. 线性表顺序存储结构代码
#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));//你猜输出了什么?

如果你懂了上述的代码,我想你应该看出来一些东西了。

  1. 声明数组data[20],其中,data其实是一个指针变量,存的是第一个数据元素的地址。
  2. data[0]其实是缩写,与*data可以互换。也就是通过data这个地址可以改变数组中的任何一个数据元素的值。

这就是线性表的基础,明天我们将进行线性表基本操作,明天将涉及更多的代码,希望各位小白同学(包括我)都能好好坚持,学好数据结构,如有问题,欢迎加微信(18813068112)进行交流,谢谢大家批评指正

猜你喜欢

转载自blog.csdn.net/qq_37068780/article/details/81460978
今日推荐