基础概念
A1-A2-A3-...An 数据元素被一条线串起来
定义
线性表是具有相同特性数据元素的有限序列
相同特性 把同一类事物归类,方便批量处理
有限 表中元素个数为n,n有限大,n可以为0
序列 表中元素排成一排,体现了一对一的逻辑特性(每个元素有且仅有一个前驱和后继)
存储结构
顺序结构
利用数组来实现顺序的存储,使用位置关系来体现逻辑关系
A |
B |
C |
... |
X |
... |
|
0 |
1 |
2 |
... |
lengh-1 |
... |
maxsize |
链式存储结构结构(单链表)
每个元素之间散列,通过其他的位置信息(指针)指向下个元素
typedef struct LNode
{
int data; //存储数据
struct LNode *next; //指针,存储指向下一个单元的存储信息
}LNode;
LNode *L;
L=(LNode*)malloc(sizeof(LNode));
A->next = B; B->next = C; C->next = D;
常用的两类单链表
A结点为开始节点 C结点为尾结点
1.head-[ |*next]-[A|*next]-[B|*next]-[C|NULL]
含有头节点的链表(实际中都是用这个)
当Head->next==NULL时,为空链表
2.head-[A|*next]-[B|*next]-[C|NULL]
不含头节点的链表
当Head==NULL时,为空链表
找一个结点的前驱结点时,需要从头指针遍历,非常麻烦
若想要每个结点都可以快速找到前驱结点,需要再加一个前驱指针
链式存储结构(双链表)
每个结点增加了前驱指针
typedef struct DLNode
{
int data;
struct DLNode *next;
struct DLNode *prior;
}DLNode;
DLNode *L;
L = (DLNode)malloc(sizeof(DLNode));
A->next = B; B->next = C; C->next = D;
D->prior = C; C->prior = B; B->prior = A;
双链表也同样包括含有头结点的链表和不含有头节点的链表
双链表在找前驱时会更好找,但如果头结点受损,单链表无法找到头结点,双链表需要遍历整个链表
链式存储结构(循环链表)
将最后一个结点的空指针指向头结点
单链表->单循环链表
Head->next == head 链表为空
双链表->双循环链表
Head->next == head或
Head->prior == head 链表为空
对于不含头结点的链表,当Head==NULL时,链表为空
所以循环链表不论什么情况下都不会存在空指针