#include <stdio.h>
#include <stdlib.h>
// 定义节点结构体
typedef struct Node {
int data; // 数据域
struct Node* prev; // 指向前驱节点的指针
struct Node* next; // 指向后继节点的指针
} Node;
// 初始化空链表
Node* createList() {
return NULL;
}
// 创建新节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("内存分配失败\n");
exit(EXIT_FAILURE);
}
newNode->data = data;
newNode->prev = NULL;
newNode->next = NULL;
return newNode;
}
// 在链表头部插入节点
void insertAtHead(Node** head, int data) {
Node* newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
} else {
newNode->next = *head;
(*head)->prev = newNode;
*head = newNode;
}
}
// 在链表尾部插入节点
void insertAtTail(Node** head, int data) {
Node* newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
} else {
Node* temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
newNode->prev = temp;
}
}
// 遍历双向链表
void traverseList(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("Data: %d\n", temp->data);
temp = temp->next;
}
}
// 删除节点(假设知道要删除的节点)
void deleteNode(Node** head, Node* nodeToDelete) {
if (*head == NULL || nodeToDelete == NULL) return;
if (*head == nodeToDelete) {
*head = nodeToDelete->next;
if (*head != NULL) (*head)->prev = NULL;
free(nodeToDelete);
return;
}
Node* temp = *head;
while (temp != NULL && temp->next != nodeToDelete) {
temp = temp->next;
}
if (temp != NULL) {
temp->next = nodeToDelete->next;
if (nodeToDelete->next != NULL) nodeToDelete->next->prev = temp;
free(nodeToDelete);
}
}
int main() {
Node* head = createList();
insertAtHead(&head, 5);
insertAtTail(&head, 10);
insertAtTail(&head, 15);
traverseList(head); // 输出双向链表内容
// 假设要删除值为10的节点
Node* toDelete = head->next;
deleteNode(&head, toDelete);
traverseList(head); // 再次输出双向链表内容
return 0;
}
C语言编程实现双向链表
最新推荐文章于 2024-09-26 22:55:54 发布
本文详细介绍了如何使用C语言实现双向链表,包括创建链表、在头部和尾部插入节点、遍历链表以及删除指定节点的操作。
摘要由CSDN通过智能技术生成