单链表(Singly Linked List)是一种常见的数据结构,用于存储线性数据。它由一系列节点组成,每个节点包含两个部分:数据域和指针域。数据域存储实际的数据,指针域指向下一个节点。以下是单链表的基本概念和操作:
单链表的特点
1. 非连续存储:单链表的节点在内存中不需要连续存储。
2. 单向链接:每个节点只包含一个指向下一个节点的指针。
3. 动态大小:可以根据需要动态增加或减少节点数量。
单链表的基本操作
1. 初始化:创建一个空的单链表。
typedef struct LNode {
int data;
struct LNode *next;
} LNode, *LinkList;
void InitList(LinkList *L) {
*L = (LNode *)malloc(sizeof(LNode));
(*L)->next = NULL;
}
2. 插入:
头插法:将新节点插入到链表的头部。
void HeadInsert(LinkList *L, int x) {
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = (*L)->next;
(*L)->next = s;
}
尾插法:将新节点插入到链表的尾部。
void TailInsert(LinkList *L, int x) {
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = x;
LNode *r = *L;
while (r->next != NULL) {
r = r->next;
}
r->next = s;
s->next = NULL;
}
3. 删除:删除指定值的节点。
void DeleteNode(LinkList *L, int x) {
LNode *p = *L;
while (p->next != NULL && p->next->data != x) {
p = p->next;
}
if (p->next != NULL) {
LNode *q = p->next;
p->next = q->next;
free(q);
}
}
4. 查找:查找指定值的节点。
LNode* FindNode(LinkList L, int x) {
LNode *p = L->next;
while (p != NULL && p->data != x) {
p = p->next;
}
return p;
}
5. 遍历:遍历并打印链表中的所有节点。
void PrintList(LinkList L) {
LNode *p = L->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
具体操作
int main() {
LinkList L;
InitList(&L);
HeadInsert(&L, 1);
HeadInsert(&L, 2);
TailInsert(&L, 3);
PrintList(L); // 输出: 2 1 3
DeleteNode(&L, 1);
PrintList(L); // 输出: 2 3
LNode *node = FindNode(L, 3);
if (node != NULL) {
printf("Found: %d\n", node->data); // 输出: Found: 3
}
return 0;
}