线性表: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.有哪些线性表?
向量
目录表
栈
队列
数组
广义表