用C语言写一个带注释的双向链表
时间: 2023-09-24 22:11:38 浏览: 65
C语言自学链表,单向链表,双向链表,适合新手学习。
好的,下面是用C语言写一个带注释的双向链表的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *prev; // 指向前一个节点的指针
struct Node *next; // 指向后一个节点的指针
} Node;
Node *head = NULL; // 链表头指针
// 在链表末尾添加节点
void append(int data) {
Node *new_node = (Node*)malloc(sizeof(Node));
new_node->data = data;
new_node->next = NULL;
if (head == NULL) {
// 如果链表为空,将新节点赋值为头节点
new_node->prev = NULL;
head = new_node;
} else {
Node *last_node = head;
// 找到链表末尾节点
while (last_node->next != NULL) {
last_node = last_node->next;
}
// 将新节点添加到末尾节点后面
last_node->next = new_node;
new_node->prev = last_node;
}
}
// 在链表中间插入节点
void insert(int data, int position) {
Node *new_node = (Node*)malloc(sizeof(Node));
new_node->data = data;
if (head == NULL || position == 1) {
// 如果链表为空或插入位置为1,将新节点赋值为头节点
new_node->prev = NULL;
new_node->next = head;
if (head != NULL) {
head->prev = new_node;
}
head = new_node;
} else {
Node *current_node = head;
// 找到插入位置的前一个节点
for (int i = 1; i < position - 1; i++) {
if (current_node->next == NULL) {
printf("插入位置超出链表长度\n");
return;
}
current_node = current_node->next;
}
// 将新节点插入到当前节点和下一个节点之间
new_node->prev = current_node;
new_node->next = current_node->next;
if (current_node->next != NULL) {
current_node->next->prev = new_node;
}
current_node->next = new_node;
}
}
// 删除链表中的节点
void delete(int position) {
if (head == NULL) {
printf("链表为空\n");
return;
}
if (position == 1) {
// 如果删除头节点
Node *temp = head;
if (head->next != NULL) {
head->next->prev = NULL;
}
head = head->next;
free(temp);
} else {
Node *current_node = head;
// 找到要删除的节点
for (int i = 1; i < position; i++) {
if (current_node == NULL) {
printf("删除位置超出链表长度\n");
return;
}
current_node = current_node->next;
}
// 将删除节点的前一个节点和后一个节点连接起来
current_node->prev->next = current_node->next;
if (current_node->next != NULL) {
current_node->next->prev = current_node->prev;
}
free(current_node);
}
}
// 打印链表中的所有节点
void print_list() {
Node *current_node = head;
while (current_node != NULL) {
printf("%d ", current_node->data);
current_node = current_node->next;
}
printf("\n");
}
int main() {
append(1);
append(2);
append(3);
print_list(); // 1 2 3
insert(4, 2);
print_list(); // 1 4 2 3
delete(3);
print_list(); // 1 4 3
return 0;
}
```
这个双向链表包含了四个基本操作:在链表末尾添加节点、在链表中间插入节点、删除链表中的节点和打印链表中的所有节点。每个操作都有详细的注释,方便理解和修改。
阅读全文