2之线性表

2020-01-18

线性表:Linear list

逻辑结构,存储结构,相应算法
## 逻辑结构
具有n相同特性的数据元素的有限序列。
n为0时空表。
如用ai表示数据元素,则i称为数据元素ai在线性表中的位序。
linear list = (a1,a2,...,an),ai-1 是 ai的直接前驱,ai是ai-1的直接后继,`i>2,i<n`时,ai有且只有一个直接前驱,有且只有一个直接后继。

ADT List = {
    数据对象:D={ai|ai属于ElemSet,i=1,2,3,...,n,n>=0},
    数据关系:R={<ai-1,ai>|ai-1,ai属于D,i=2,3,...,n},
    基本操作:
		1.初始化
		2.建新表
		3.判空
		4.求长
		5.取结点(at i)
		6.寻值(value is XX)
		7.插入(to i)
		8.删除(at i)
}

## 存储结构
顺序实现--> 顺序表Sequential List

链式实现--> 链表Linked List(单链表Singly Linked List ,双链表Double Linked List,循环链表Circular Linked List)

参考:《数据结构(C语言版)(严蔚敏)》

 

顺序存储---顺序表sequential list(逻辑相邻物理也相邻,比较紧凑)

定位第i个元素,时间复杂度为O(1)
插入或删除元素时可能要移动很多很多元素

链式存储---

存储单元可以连续也可以不连续,所以要定位这些元素就需要有一个除数据域外的 指针域。
这些指针域中的指针链接了这些结点形成一个链表。
线性链表
  typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;
  插、删仅需调整前中后的指针指向 时间复杂度都为O(n)

静态链表,我认为也还是一个单向的链表,每个元素存下一个的地址,没办法向前指向。所以要给出起始元素位置。跟线性链表一样。不一样的是这些元素的存储是连续的。

循环链表circular linked list ,最后一个结点指向首节点,从任意结点出发均可到任意结点,形成一个环。

双向链表double linked list,一个节点中三个域,
  typedef struct DNode{
    ElemType data;
    Dnode *prior;
    Dnode *next;
}DNode,DlinkedList;
双向循环链表

3.有哪些线性表?

向量

目录表

队列

数组

广义表