📅  最后修改于: 2023-12-03 15:07:21.182000             🧑  作者: Mango
单链表(Singly Linked List),是链表的一种,是链表中最简单的一种形式。单链表的每个节点只包含一个指针,指向下一个节点,最后一个节点指向空值。下面将会进行更加详细的介绍。
单链表是由若干个节点组成,每个节点只包含一个指针,指向下一个节点。最后一个节点的指针指向空值。单链表可以用来表示线性表或其他类似结构。
单链表具有以下特点:
单链表中的每个节点都包含两个部分,一个是存放数据元素的数据域,另一个是存放下一个节点地址的指针域。下面是示例代码:
typedef struct Node {
int data; // 数据域
struct Node *next; // 指针域
} Node;
下面是一个单链表节点的示意图:
+--------+--------+
| data | next |
+--------+--------+
单链表的基本操作包括:
在单链表被使用之前,必须对其进行初始化。初始化操作通常包括创建空链表、设置链表头等。下面是示例代码:
// 创建链表头指针
Node *head = NULL;
// 创建空链表
head = (Node *)malloc(sizeof(Node));
head->next= NULL;
单链表的插入操作包括头插法和尾插法。头插法是将新节点插入到链表头之后,尾插法是将新节点插入到链表尾之后。下面是示例代码:
// 头插法
Node *p = NULL;
p = (Node *)malloc(sizeof(Node));
p->data = 1;
p->next = head->next;
head->next = p;
// 尾插法
Node *p = NULL;
Node *tail = NULL;
p = (Node *)malloc(sizeof(Node));
tail = head;
while (tail->next != NULL) {
tail = tail->next;
}
p->data = 1;
p->next = NULL;
tail->next = p;
单链表的删除操作需要知道要删除的节点的前驱节点。删除操作通常分为删除头节点和删除中间节点。下面是示例代码:
// 删除头节点
Node *p = NULL;
p = head->next;
head->next = p->next;
free(p);
// 删除中间节点
Node *p = NULL;
Node *q = NULL;
p = head;
while (p->next != NULL && p->next->data != data) {
p = p->next;
}
if (p->next != NULL) {
q = p->next;
p->next = q->next;
free(q);
}
单链表的查找操作需要遍历整个链表来查找相应的元素。下面是示例代码:
Node *p = head->next;
while (p != NULL && p->data != data) {
p = p->next;
}
if (p != NULL) {
// 找到了
} else {
// 没有找到
}
单链表的遍历操作就是依次访问链表中的每个节点。下面是示例代码:
Node *p = head->next;
while (p != NULL) {
// 对每个节点进行处理
p = p->next;
}
单链表是链表常用的一种形式,具有随机存取性差、插入和删除操作快的特点。掌握单链表的基本操作对于理解其他链表结构具有重要意义。