定义结构体
// 定义链表节点结构体
typedef struct Node {
int data; // 节点存储的数据
struct Node *next; // 指向下一个节点的指针
} Node;
初始化单链表
// 初始化链表节点函数
// 返回值: 返回一个新的链表节点指针
Node *initNode() {
Node *head = (Node *) malloc(sizeof(Node)); // 分配一个新的节点
head->data = 0; // 初始化节点数据为0
head->next = NULL; // 初始化下一个节点指针为NULL
return head; // 返回新节点指针
}
插入结点
// 头插法插入节点函数
// 参数:
// head: 链表的头节点指针
// data: 待插入节点的数据
void headInsert(Node *head, int data) {
Node *p = (Node *) malloc(sizeof(Node)); // 分配一个新的节点
p->data = data; // 设置节点数据
p->next = head->next; // 将新节点的next指针指向原头节点
head->next = p; // 将头节点的next指针指向新节点,使其成为新的头节点
head->data++; // 更新链表长度
}
// 尾插法插入节点函数
// 参数:
// head: 链表的头节点指针
// data: 待插入节点的数据
void tailInsert(Node *head, int data) {
Node *p = (Node *) malloc(sizeof(Node)); // 分配一个新的节点
p->data = data; // 设置节点数据
Node *q = head; // 用于遍历链表的指针
while (q->next) { // 找到链表尾部
q = q->next;
}
q->next = p; // 将尾节点的next指针指向新节点
p->next = NULL; // 设置新节点的next指针为NULL
head->data++; // 更新链表长度
}
删除结点
// 删除节点函数
// 参数:
// head: 链表的头节点指针
// data: 待删除节点的数据
void deleteLine(Node *head, int data) {
Node *p = head; // 用于遍历链表的指针
while (p->next) { // 遍历链表
if (p->next->data == data) { // 找到待删除节点
Node *q = p->next; // 保存待删除节点指针
p->next = q->next; // 将待删除节点从链表中移除
free(q); // 释放待删除节点内存
head->data--; // 更新链表长度
}
p = p->next; // 移动到下一个节点
}
}
遍历结点
// 打印链表函数
// 参数:
// head: 链表的头节点指针
void printList(Node *head) {
head = head->next; // 移动到第一个数据节点
while (head) { // 遍历链表
printf("%d -> ", head->data); // 打印当前节点数据
head = head->next; // 移动到下一个节点
}
printf("NULL"); // 打印链表尾部标识
}
案例展示
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data; // 节点存储的数据
struct Node *next; // 指向下一个节点的指针
} Node;
// 初始化链表节点函数
// 返回值: 返回一个新的链表节点指针
Node *initNode() {
Node *head = (Node *) malloc(sizeof(Node)); // 分配一个新的节点
head->data = 0; // 初始化节点数据为0
head->next = NULL; // 初始化下一个节点指针为NULL
return head; // 返回新节点指针
}
// 头插法插入节点函数
// 参数:
// head: 链表的头节点指针
// data: 待插入节点的数据
void headInsert(Node *head, int data) {
Node *p = (Node *) malloc(sizeof(Node)); // 分配一个新的节点
p->data = data; // 设置节点数据
p->next = head->next; // 将新节点的next指针指向原头节点
head->next = p; // 将头节点的next指针指向新节点,使其成为新的头节点
head->data++; // 更新链表长度
}
// 尾插法插入节点函数
// 参数:
// head: 链表的头节点指针
// data: 待插入节点的数据
void tailInsert(Node *head, int data) {
Node *p = (Node *) malloc(sizeof(Node)); // 分配一个新的节点
p->data = data; // 设置节点数据
Node *q = head; // 用于遍历链表的指针
while (q->next) { // 找到链表尾部
q = q->next;
}
q->next = p; // 将尾节点的next指针指向新节点
p->next = NULL; // 设置新节点的next指针为NULL
head->data++; // 更新链表长度
}
// 删除节点函数
// 参数:
// head: 链表的头节点指针
// data: 待删除节点的数据
void deleteLine(Node *head, int data) {
Node *p = head; // 用于遍历链表的指针
while (p->next) { // 遍历链表
if (p->next->data == data) { // 找到待删除节点
Node *q = p->next; // 保存待删除节点指针
p->next = q->next; // 将待删除节点从链表中移除
free(q); // 释放待删除节点内存
head->data--; // 更新链表长度
}
p = p->next; // 移动到下一个节点
}
}
// 打印链表函数
// 参数:
// head: 链表的头节点指针
void printList(Node *head) {
head = head->next; // 移动到第一个数据节点
while (head) { // 遍历链表
printf("%d -> ", head->data); // 打印当前节点数据
head = head->next; // 移动到下一个节点
}
printf("NULL"); // 打印链表尾部标识
}
// 主函数
int main() {
Node *head = initNode(); // 初始化链表
headInsert(head, 1); // 使用头插法插入数据
headInsert(head, 2);
headInsert(head, 3);
headInsert(head, 4);
tailInsert(head, 5); // 使用尾插法插入数据
tailInsert(head, 6);
tailInsert(head, 7);
deleteLine(head, 4); // 删除数据为4的节点
printList(head); // 打印链表
return 0;
}