单链表的定义
单链表是线性表的一种链式存储实现。它通过一组任意的存储单元来存储数据元素,利用指针建立节点间的关系。每个结点包含数据域(data)和指针域(next),后者指向后继结点的地址。
typedef struct LNode {
ElemType data;
struct LNode* next;
}LNode, *LinkList;
注意代码中 LNode* 强调这是一个结点,而 LinkList 强调这是一个单链表。由于元素在内存中离散分布,单链表不支持随机存取,查找特定元素需从表头遍历,时间复杂度为 O(n)。
关于头节点和头指针:无论是否有头节点,头指针始终指向链表的第一个结点。引入头结点的优点在于统一了空表和非空表的处理逻辑,且第一个数据结点的位置操作与其他位置一致。
单链表的基本操作
初始化
带头结点的初始化需要申请一块内存作为头结点,并将 next 指针置为空。不带头结点的则直接将头指针设为 NULL。
bool InitList(LinkList& L) {
L = (LNode*)malloc(sizeof(LNode));
L->next = NULL;
return true;
}
判空与求表长
判空时检查头结点的 next 是否为 NULL。求表长则需遍历链表计数,直到末尾。
int Length(LinkList L) {
int len = 0;
LNode* p = L;
while (p->next != NULL) {
p = p->next;
len++;
}
return len;
}
查找操作
按序号查找需从头遍历至第 i 个位置;按值查找则逐个比对数据域,找到匹配项返回地址,否则返回 NULL。
LNode* GetElem(LinkList L, int i) {
LNode* p = L;
int j = 0;
while (p != NULL && j < i) {
p = p->next;
j++;
}
return p;
}
LNode* {
LNode* p = L->next;
(p != && p->data != e)
p = p->next;
p;
}


