一.线性表(Linear List)的定义:线性表示具有相同数据类型的n(n>=0)个数据元素的有限序列,通常记为:(a1,a2,a3,...,ai-1,ai,ai+1,...,an)
二线性表的基本操作:
(1)InitList(L):初始化操作,置L为空线性表。
(2)ClearList(L):清除线性表的内容,将L置为空表。
(3)ListLength(L):求表长。
(4)Ins(L,i,Item):插入数据,把表Item插入到表L的i位置。
(5)Del(L,i):删除数据。
(6)GetNext(L,Item,p):获取表L的Item值所在的节点的后继节点并赋值给p。
(7)GetNode(L,i):获取表L中位置为i的节点值。
(8)Loc(L,Item):定位(返回第一次找到该值得位置)。
(9)GetPrior(L,Item,p):获取表L的Item值所在的节点的前趋节点并赋值给p。
三.顺序表(顺序存储,随机存取):线性表的顺序存储方式,是指利用一段连续的内存地址来存储线性表的数据元素。如,在c语言中用数组来实现。存储结构示例。 顺序表的基本操作略。
# define int datatype;
# define maxsize 1024;
typedef struct sequenlist{
datatype elem[maxsize];
int length;
}sequenlistalias;
四.链表(随机存储,顺序存取):以链式结构存储的线性表称为链表。链式存储结构是用一组任意的存储单元来存储线性表的节点。每个节点由数据域和指针域两部分组成。链表的命名一般由头指针的名字来命名。为了方便判断空表,插入和删除节点,我们一般在第一个节点前面增加一个附加节点,称为头节点。
五.单链表:每个节点只有一个指针域。如c语言描述。基本操作实现略。
typedef char ElemType;
typedef struct LNode{
ElemType date;
struct LNode *next;
}LNode,*LinkList
六.循环链单链表(Circular Linked List):是一种首尾相连的链表。能够提供代码的健壮性,把最后一个节点的指针域指向第一个节点(头节点)。基本操作实现略。。
七.双向链表(Double Linked List):方便查询某个节点的前沿节点,c语言描述。基本操作实现略。
typedef char ElemType;
typedef struct LNode{
struct LNode *prior;
ElemType date;
struct LNode *next;
}LNode,*LinkList
八.双向循环列表:双向链表的首尾相连起来就是双向循环列表。基本操作实现略。
九.静态链表:解决一些设计语言不支持“”指针"数据类型,但是又需要实现链表。如:
# define MAXSIZE 1000
typedef int ElemType;
typedef struct SList
{
ElemType date;
int next;
}node;
node SlinkList[MAXSIZE]; /*备用节点空间*/
int av; /*游标变量*/
十,线性存表顺序存储与链式存储比较。
运算 | 存储方式 | 元素平均移动位置 | 时间复杂度 |
---|---|---|---|
初始化线性表 | 顺序存储 | 0 | O(1) |
链式存储 | 0 | O(1) | |
删除已存在的表 | 顺序存储 | 0 | O(1) |
链式存储 | 0 | O(n) | |
清除表的内容 | 顺序存储 | 0 | O(n) |
链式存储 | 0 | O(n) | |
求表长 | 顺序存储 | 0 | O(1) |
链式存储 | 0 | O(n) | |
获取某个节点的值 | 顺序存储 | 0 | O(1) |
链式存储 | 0 | O(n) | |
定位(按值查找) | 顺序存储 | 0 | O(n) |
链式存储 | 0 | O(n) | |
插入数据 | 顺序存储 | n-i | O(n) |
链式存储 | 0 | O(n) | |
删除数据 | 顺序存储 | n-i | O(n) |
链式存储 | 0 | O(n) | |
获取前趋节点 | 顺序存储 | 0 | O(1) |
链式存储 | 0 | O(n) | |
获取后继节点 | 顺序存储 | 0 | O(1) |
链式存储 | 0 | O(n) |
结论:频繁查询用顺序存储;频繁删除,增加,或者表表太长用链式存储。