微信公众号:魔七宝
求关注!后续会将所有内容分享在公众号!!希望大家可以关注一下!!!谢谢!!!
代码解释:
节点结构体:定义了一个包含数据、前驱和后继指针的结构体 Node 。
创建节点: createNode 函数用于动态分配内存并初始化一个新节点。
插入节点:提供了在链表头部和尾部插入节点的功能。
打印链表: printList 函数用于遍历并打印链表中的所有元素。
释放内存: freeList 函数用于释放链表占用的内存。
主函数:在 main 函数中演示了如何使用这些功能。
#include <stdio.h>
#include <stdlib.h>
// 定义双向链表节点结构体
typedef struct Node {
int data; // 节点存储的数据
struct Node* prev; // 指向前一个节点的指针
struct Node* next; // 指向下一个节点的指针
} Node;
// 创建新节点的函数
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node)); // 分配内存
newNode->data = data; // 设置节点数据
newNode->prev = NULL; // 初始化前驱指针
newNode->next = NULL; // 初始化后继指针
return newNode; // 返回新节点
}
// 在链表头部插入节点的函数
void insertAtHead(Node** head, int data) {
Node* newNode = createNode(data); // 创建新节点
newNode->next = *head; // 将新节点的next指向当前头节点
if (*head != NULL) { // 如果当前链表不为空
(*head)->prev = newNode; // 设置当前头节点的prev指向新节点
}
*head = newNode; // 更新头指针为新节点
}
// 在链表尾部插入节点的函数
void insertAtTail(Node** head, int data) {
Node* newNode = createNode(data); // 创建新节点
if (*head == NULL) { // 如果链表为空
*head = newNode; // 直接将新节点设为头节点
return;
}
Node* temp = *head; // 临时指针用于遍历链表
while (temp->next != NULL) { // 遍历到链表尾部
temp = temp->next; // 移动到下一个节点
}
temp->next = newNode; // 将尾节点的next指向新节点
newNode->prev = temp; // 设置新节点的prev指向当前尾节点
}
// 打印链表的函数
void printList(Node* head) {
Node* temp = head; // 从头节点开始遍历
while (temp != NULL) { // 当当前节点不为空
printf("%d ", temp->data); // 打印当前节点的数据
temp = temp->next; // 移动到下一个节点
}
printf("\n"); // 打印换行符
}
// 释放链表的内存
void freeList(Node* head) {
Node* temp;
while (head != NULL) { // 当链表不为空
temp = head; // 临时保存当前节点
head = head->next; // 移动到下一个节点
free(temp); // 释放当前节点的内存
}
}
int main() {
Node* head = NULL; // 初始化链表头指针为空
insertAtHead(&head, 10); // 在头部插入10
insertAtTail(&head, 20); // 在尾部插入20
insertAtTail(&head, 30); // 在尾部插入30
printList(head); // 打印链表
freeList(head); // 释放链表的内存
return 0; // 返回0表示程序正常结束
}