数据结构(二) 线性表-2

1.顺序存储结构不足的解决办法

线性表的顺序存储结构就是插入和删除时,需要移动大量元素

问题的根源在于:相邻的两个数据元素的存储位置具有邻居关系

插入操作,为了保持原有的数据元素的相邻关系,插入位置之后的数据元素以此往后移动。

删除操作,所删元素留下的空隙自然需要你补,数据元素要往前移动。

解决办法:采用链式存储结构

2.链式存储结构定义

2.1 几个重要概念

链式存储结构的特点:用一组任意存储单元存储线性表的数据元素

链式存储结构定义:每个元素包含一个数据域和一个指针域。指针域指向其直接后继元素。

结点:一个数据域,一个指针域,指针域指向另一个节点

链表:N个节点构成

单链表:线性表由由节点构成并且,每个节点只包含一个指针域

头指针:表的第一个节点的存储位置

头节点:单链表第一个节点前附设一个节点,为头节点,头节点可以不存储任何信息,也可以存储如线性表的长度等附加信息,头节点的指针域存储第一个节点的指针

2.2 头指针和头节点

这两个概念容易混淆。需要加以区分

头指针:

  1. 头指针是 链表指向第一个节点的指针,若链表由头节点,则为指向头节点的指针
  2. 头指针具有标识作用,常用头指针冠以链表的名字
  3. 无论链表是否为空,头指针均不为空,头指针是链表的必要元素

头节点

  1. 头节点是为了操作的统一和方便设立的,放在第一个元素之前,其数据域一般无意义(也可存放链表长度)
  2. 有了头节点,对第一元素节点前的插入和删除第一个节点,其操作和其他节点统一
  3. 头节点不一定是链表的必要元素

2.3 单链表的存储结构定义

typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */

typedef struct Node
{
    ElemType data;
    struct Node *next;
}Node;
typedef struct Node *LinkList;