线性表基础知识(一)

来源:互联网 发布:js工厂方法 编辑:程序博客网 时间:2024/05/01 09:20

 定义

线性表是最简单、最基本、也是最常用的一种线性结构,它有顺序存储和链式存储两种存储方式,主要的基本运算为插入、删除、和查找

形式化定义

liner_list=(D,R);
其中,D={a|a属于数据对象E,a=1,2,3....,n,n>=0}      R={N}, N={<ai-1,ai>|ai-1,ai属于数据对象E,i=2,3,...n}
N是一个序偶的集合,它表示线性表中数据元素之间的相邻关系

线性表的基本运算 

INITIATE (L)   初始化操作|设定一个空的线性表L
LENGTH (L)   求长度函数|函数值为线性表L中数据元素的个数
GET (L,i)   取元素函数|1<=i<=LENGTH(L)时返回L中第i个数据元素,否则为空元素NULL。i称为该数据元素在L中的 位序
PRIOR (L,elm) 求前驱函数|elm为L中的一个数据元素,若它的位序大于1,则函数值为elm前驱,否则为NULL
NEXT(L,elm)   求后继函数|若elm位序小于表长,则函数值为elm的后继,否则为NULL
LOCATE(L,x)  定位函数|给定值x,若x不在表中,则返回0,否则,返回x在表中第一次出现时的位许
INSERTE(L,i,b) 前插操作|在第i个元素之前插入新元素b,i的取值范围为:1<=i<=n+1;i=n+1表示在表尾插入,n为表长
DELETE(L,i) 删除操作|删除线性表L中的第i个元素,1<=i<=n
EMPTY(L) 判空表函数|若L为空表,则返回布尔值true,否则返回布尔值false
CLEAR(L) 表置空操作|将L置为空表

例子:求两个集合的并,即A=A并B
分析:设A、B分别由两个线性表LA和LB表示,要求将LB中存在而LA中不存在的DE插入到表LA中
算法思想:
1.依次从LB中取出一个DE
2.判断LA中是否存在
3.若不存在,则插入到LA中
算法实现:
    类PASCAL
           PROC union(VAR LA:Linear_list;LB:Linear_list);
           {将所有在LB中存在而LA中不存在的DE插入到LA中去}
           n:LENGTH(LA):{确定线性表LA的长度}
           FOR i:=1 TO LENGTH(LB) DO
           [x:GET(LB,i);{取LB中第i个数据元素}
                k:LOCATE(LA,x);{在LA中进行搜索}
                IF k=0 THEN [INSERT(LA,n+1,x);{在LA表尾插入}
                n:n+1{表长加1}]
           ]
        ENDP;{union}


线性表的存储结构

 --->顺序存储结构

线性表的顺序存储结构是指:用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻

优点:

        可以随机存取表中的元素,按序号查找元素的速度很快。

缺点:

        插入和删除操作需要移动元素,插入之前要移动元素以挪出空的存储单元,然后再插入元素;删除时同样需要移动元素,以填充被删除的元素空出来的存储单元。

---->链式存储结构

线性表的链式存储是用结点来存储数据元素,元素的结点地址可以连续,也可以不连续,因此,存储数据元素的同时必须存储存储元素之间的逻辑关系。数据域用于存储数据元素的值,指针域则存储当前元素的直接前驱或直接后继的位置信息。

     ----->单链表

          n个结点通过指针连成一个链表,若节点中只有一个指针域,则称为线性链表(单链表)