帮我用C语言写一个双向链表
时间: 2023-12-29 14:54:57 浏览: 95
以下是一个基本的双向链表的C语言实现:
```
#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));
newNode->data = data;
newNode->prev = NULL;
newNode->next = NULL;
return newNode;
}
// 在链表尾部插入节点
void append(struct Node** headRef, int data) {
struct Node* newNode = createNode(data);
struct Node* current = *headRef;
if (current == NULL) {
*headRef = newNode;
} else {
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
newNode->prev = current;
}
}
// 在链表头部插入节点
void prepend(struct Node** headRef, int data) {
struct Node* newNode = createNode(data);
newNode->next = *headRef;
if (*headRef != NULL) {
(*headRef)->prev = newNode;
}
*headRef = newNode;
}
// 删除链表中指定数据的节点
void removeNode(struct Node** headRef, int data) {
struct Node* current = *headRef;
while (current != NULL && current->data != data) {
current = current->next;
}
if (current == NULL) {
return;
}
if (current->prev != NULL) {
current->prev->next = current->next;
} else {
*headRef = current->next;
}
if (current->next != NULL) {
current->next->prev = current->prev;
}
free(current);
}
// 打印链表
void printList(struct Node* head) {
struct Node* current = head;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
}
int main() {
struct Node* head = NULL;
append(&head, 1);
append(&head, 2);
append(&head, 3);
prepend(&head, 0);
printList(head);
removeNode(&head, 2);
printList(head);
return 0;
}
```
该程序实现了以下操作:
- 创建一个节点结构体。
- 在链表尾部插入节点。
- 在链表头部插入节点。
- 删除链表中指定数据的节点。
- 打印链表。
请注意,该程序仅实现了基本的操作,您可以根据需要扩展该程序以实现其他操作。
阅读全文