线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素的尾指针指向了首位结点)。
概念
-
单链表:链表的每个结点只有一个指针域。
-
静态链表:
-
双向链表:
-
循环链表:首尾相接的链表。
-
循环单链表:单链表最后一个结点的指针域由NULL改为指向头结点或线性表中的第一个结点。
-
头指针:指向链表中第一个结点的指针。
-
头结点:链表的首元结点之前附近的一个结点;数据域内只放空表标志和表长等信息。作用:为了对链表进行操作时,可以对空表、非空表的情况以及对首元结点进行统一处理,编程更方便。
-
首元结点:指链表中存储线性表第一个数据元素a1的结点。
时间复杂度的分析
线性表类别 | 插入 | 删除 | 查找 |
---|---|---|---|
顺序表 | n/2-O(n) | (n-1)/2-O(n) | |
单链表 | O(1) | O(1) | O(n) |
顺序表操作
- 元素地址:
LOC(aj) = LOC(ai) + L*(j-i)
其中:LOC表示某个元素的地址,L表示每个元素占用的多少存储空间(字节)
单链表操作
-
删除核心代码:
q = p->next; p->next = q->next; free(q);
-
插入核心代码:
s->next = p->next; p->next = s;
-
头插法核心代码:
L->next = NULL; while: { p->next = L->next; L->next = p; }
-
尾插法核心代码:
L->next = NULL; r = L; while: { r->next = p; r = r->next; }