以下是一个C语言的高级链表使用示例,演示了如何实现一个双向链表(doubly linked list)并执行一些高级操作,包括在链表中插入、删除和反转元素。这个示例包括以下操作:
- 创建双向链表。
- 向链表头部和尾部插入元素。
- 删除链表中的特定元素。
- 遍历链表并打印元素。
- 反转链表。
#include <stdio.h>
#include <stdlib.h>
// 定义双向链表节点的结构
struct Node {
int data;
struct Node* prev;
struct Node* next;
};
// 创建新的节点
struct Node* createNode(int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
if (newNode != NULL) {
newNode->data = data;
newNode->prev = NULL;
newNode->next = NULL;
}
return newNode;
}
// 在链表头部插入节点
void insertAtHead(struct Node** head, int data) {
struct Node* newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
} else {
newNode->next = *head;
(*head)->prev = newNode;
*head = newNode;
}
}
// 在链表尾部插入节点
void insertAtTail(struct Node** head, int data) {
struct Node* newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
} else {
struct Node* current = *head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
newNode->prev = current;
}
}
// 从链表中删除特定元素
void deleteNode(struct Node** head, int data) {
if (*head == NULL) {
return;
}
struct Node* current = *head;
while (current != NULL) {
if (current->data == data) {
if (current->prev != NULL) {
current->prev->next = current->next;
} else {
*head = current->next;
}
if (current->next != NULL) {
current->next->prev = current->prev;
}
free(current);
return;
}
current = current->next;
}
}
// 遍历并打印链表
void printList(struct Node* head) {
struct Node* current = head;
while (current != NULL) {
printf("%d -> ", current->data);
current = current->next;
}
printf("NULL\n");
}
// 反转链表
void reverseList(struct Node** head) {
struct Node* current = *head;
struct Node* prev = NULL;
struct Node* next = NULL;
while (current != NULL) {
next = current->next;
current->next = prev;
current->prev = next;
prev = current;
current = next;
}
*head = prev;
}
int main() {
struct Node* head = NULL;
insertAtHead(&head, 1);
insertAtHead(&head, 2);
insertAtHead(&head, 3);
insertAtTail(&head, 4);
insertAtTail(&head, 5);
printf("链表内容:\n");
printList(head);
deleteNode(&head, 3);
printf("删除元素3后的链表内容:\n");
printList(head);
reverseList(&head);
printf("反转链表后的链表内容:\n");
printList(head);
return 0;
}
这个示例中,我们创建了一个双向链表,然后在链表头部和尾部插入元素,删除特定元素,遍历链表并打印元素,最后反转链表。这展示了链表的高级用法和操作。