数据结构2-线性表

171 阅读6分钟

线性表

1.线性表的基本概念

  • 定义
  • 特点

2.线性表的顺序表示和实现

  • 线性表的顺序表示
  • 顺序表中基本操作的实现

3.线性表的链式表示和实现

  • 线性表的链式表示(单链表)
  • 单链表的基本操作的实现
  • 循环链表
  • 双向链表

4.顺序表和链表的比较

  • 空间性能比较
  • 时间性能比较

5.线性表的合并

  • 顺序有序表的合并
  • 链式有序表的合并

1.1线性表的定义

由n个数据特征相同的元素构成的有序序列

1.2线性表的特点

存在唯一一个被称为“第一个”和“最后一个”的数据元素

除第一个元素外,结构中每个数据元素均只有一个前驱

除最后一个元素外,结构中每个数据元素均只有一个后驱

🔴C语言中可用动态分配的一维数组表示线性表


2.1线性表的顺序表示

指用一组地址连续的储存单元依次储存线性表的数据元素

(在逻辑上相邻的两个数据元素在存储的物理位置也相邻)

🔴随机存储的储存结构

每个节点=数据域

2.2顺序表中基本操作的实现

🔵操作时,需要判断i是否是合理的

2.2.3初始化(构造一个空的顺序表)

(动态分配一个预定义大小的数组空间)

2.2.4取值(根据指定的位置序号i,获取第i个数据元素的值)

可以直接取指定位置的值(数组下标)

2.2.5查找(根据指定的数据元素的值e,查找与e相等的第i个位置序号)

运用循环和判断语句,从第一个元素开始查找

2.2.6插入(在第i个位置插入一个新的数据元素e)

将i后面的元素依次向后移动一位,然后再插入新位置

2.2.7删除(将第i个位置的数据元素e删除)

将i+1后面的元素依次向前移动一位


3.1线性表的链式表示(单链表)

📘为了处理方便(首元节点,空表和非空表),在链表前的第一个节点之前附加一个节点,称为头节点。

指用一组任意的存储单元存储线性表的数据元素(该组的存储单元可连续可不连续)

(在逻辑上相邻的两个数据元素在存储的物理位置不要求相邻)

🔴顺序存储的储存结构(C语言中用结构指针来描述)

每个节点=数据域+指针域

头节点:是在首元节点前再设的一个新节点(方便处理数据)

首元节点:指链表中储存的第一个元素的节点

头指针:指向链表的第一个节点的指针(头节点/首元节点)

注意:由于单链表是由表头指针唯一确定的,所以单链表可以用头指针的名字来命名

3.2单链表的基本操作的实现

3.2.1初始化(构造一个空的链表)

(生成一个新节点作为头节点,用头指针L指向头节点。)

3.2.2取值(根据指定的位置序号i,获取第i个数据元素的值)

与顺序表不同,链表需要从首元节点出发,顺着链域逐个节点向下访问

3.2.3查找(根据指定的数据元素的值e,查找与e相等的第i个位置序号)

与顺序表类似,从首元节点出发,依次将节点值和给定值e比较

3.2.4插入(在第i个位置插入一个新的数据元素e)

生成一个新节点s储存数据元素,

先将s的指针域指向i节点,

再把i-1节点的指针域指向s节点

3.2.5删除(将第i个位置的数据元素e删除)

先生成一个新指针q指向i节点,

再把i-1节点的指针域直接指向i+1节点,

然后释放指针q指向的内容(i节点的元素e)

3.2.6创建单链表

与初始化不同,初始化操作只是创建一个只有头节点的空链表,而创建单链表是一种动态生成链表的过程(包含了若干个节点)

🔵前插法:(将新节点逐个插入链表的头部(头节点之后))

将A B C D逆位序输入数据

  • 生成一个新节点并赋值
  • 将新节点插入到头节点之后

🔵后插法:(将新节点逐个插入链表的尾部)

将A B C D顺位序输入数据

  • 生成一个新节点并赋值
  • 将新节点插入尾节点之后
  • 把尾指针指向新的尾节点

需要创建一个尾指针(一开始尾指针与头指针都指向头节点)

3.3循环链表

特点:链表的最后一个节点的指针域指向头节点

3.4双向链表

特点:链表的节点中有两个指针域,一个指向后驱,一个指向前驱

🔷插入(在第i个位置之前插入元素e)

  • 生成一个新节点s并赋值为e,
  • 先将i-1节点的后驱指针指向s节点,
  • 在将s节点的前驱指针指向i-1节点,
  • 然后将i+1节点的前驱指针指向s节点,
  • s的后驱指针指向i+1节点

🔷删除(删除第i个位置的元素)

  • 先将i+1节点的前驱指针指向i-1节点,
  • 再将i-1节点的后驱指针指向i+1节点,
  • 然后删除i节点

4.1空间性能比较

存储密度(存储空间的利用率·):数据元素本身占用的储存量与整个节点结构所占的储存量之比

顺序表:

存储空间必须预先分配,容易造成储存空间浪费和空间溢出。元素个数有限制。

存储密度较大

链表:

存储空间不需要预先分配。元素个数无限制。

储存密度较小

4.2时间性能比较

顺序表:

取值操作效率高,插入与删除操作效率低

链表:

取值操作效率低,插入与删除操作效率高


5.1顺序有序表的合并(LA,LB的合并)

  • 创建一个新的空表LC,
  • 将指针pc指向LC第一个元素,将pa,pb分别指向LA,LB的第一个元素,
  • 依次比较元素大小,将小的元素加入到LC表中,
  • 如果有一方有序表已经到表尾,则将剩下一个有序表直接加入到LC表中。

5.2链式有序表的合并 (LA,LB的合并)

  • 将LC的节点取值为LA/LB的头节点(不需要新建空表),
  • 将pa,pb分别指向LA,LB的第一个节点,pc指向LC的头节点
  • 依次比较元素大小,将小的元素所对应的节点加入到LC表中,
  • 如果有一方有序表已经到表尾,则将剩下一个有序表直接插入到pc所指的节点后。
  • 然后释放LB/LA的头节点。

🔺不需要创建一个新的空表