数据结构学习笔记--线性表篇

158 阅读4分钟

线性表的定义

  • 线性表是最简单和最常用的一种数据结构,由n(n>=0)个相同类型的数据元素(结点)组成的一个有序数列。

  • 线性表中所含元素的个数个数n定义为线性表的长度

  • 当n>0时,称为空表,用一对空括号标示。记为()

  • 当n>0时,可表示为(a1,a2...,an),a1称为表头元素,an称为表尾元素,a(i-1)称为ai的直接前驱,a(i+1)称为ai的直接后继(2<= i <= n-1)

线性表的基本运算

  1. 初始化操作 InitList(L):线性表不存在,创建一个空的线性表L
  2. 求表长度 ListLength(L):求线性表L中所有数据元素的个数
  3. 取表元素 GetNode(L,i):输出线性表L中第i位置上的元素
  4. 定位元素 LocateNode(L,x):在线性表中查找值为x的数据元素首次出现的位置
  5. 插入操作 InsertList(L,i,x):在线性表L中的第i位置上插入一个元素x
  6. 删除操作 DeleteList(L,i):在线性表L中删除第i位置上的元素

线性表的存储方式

(一)线性表的顺序存储结构

用一组地址连续的存储空间一次存储线性表中的数据元素。即逻辑上相邻的元素存储在的存储单元物理位置也是相邻的。

一般用这种方法存储的线性表简称顺序表,顺序表在内存的起始地址称作顺序表的基地址。

线性表的顺序存储结构中的特点:

  1. 数据在线性表中相邻,在计算机内存中也相邻。
  2. 只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以顺序表是一种随机存储结构。
  3. 容量固定,访问速度快

实现线性表的逆置:将(a1,a2,a3...an)转换为(an,....a2,a1)

    SeqList Conveerts (SeqList L)
    {
        DataType x;
        int i,k=L.length/2;
        for(i = 0; i<k; i++)
        {
            x = L.data[i];
            L.data[i] = L.data[L.length-i-1];
            L.data[L.length-i-1] = x;
        }
        return L;
    }

(二)线性表的链式存储结构

可以用内存空间一组任意的存储单元(可以是地址连续的,也可以是不连续的)来存储线性表中的数据元素(data)。

在存储数据元素时,除了存储数据元素本身外,还有存储与它相邻的数据元素在内存中的存储地址信息。这两部分信息组成该数据元素的存储映像(Image),称为结点(Node)

把存储数据元素本身信息的域叫结点的数据域(Data Domain)

把存储与它相邻的数据元素的存储地址信息的域叫结点的指针域(Reference Domain)

线性表通过每个结点的指针域(引用域)形成了一个‘链条’,所以也叫做链表,单链表的头用 head 声明,尾部用 rear声明。head-》 |data|next| 。。。 |data|next| 《-rear

如果结点的指针域只存储该结点直接后继(next)结点的存储地址,则该链表叫“单链表”,单链表由:数据域(存储元素本身信息)和指针域(存储表中下一个结点的存储地址)两部分组成

如果单链表中的最后结点的指针域不为空,而是指向单链表的头结点,这样就形成了一个“单循环链表”,优点:从表的任一结点都可以访问表中其他结点

如果单链表的结点中增加一个指向其直接前趋的指针域(prior),这样就形成了双向链表。--》|prior|data|next|

有时候为了操作运算方便,将双向链表的尾结点和头结点链接起来,就构成了双向循环列表。

(三)顺序表和链表的比较

  1. 顺序存储结构的特点:元素的存储位置可以用一个简单的公式计算,可以随机存取任一元素,然而插入和删除时,需移动大量数据元素。
  2. 链式存储结构的特点:在插入和删除时,不需要移动大量数据元素,但是失去了随机访问数据元素的特点。
  3. 时间性能比较:如果在实际问题中,对线性表的操作是经常性的查找运算,以顺序存储结构为宜,如果经常进行的运算是插入和删除运算,以链式存储结构为宜。
  4. 空间性能比较:数据量预先知道,适合使用顺序存储,数据量变动较大的动态问题,适合使用链式存储