c语言双向链表插入和删除
时间: 2023-09-17 22:06:33 浏览: 129
双向链表是一种常见的数据结构,它的每个节点都包含指向前一个节点和后一个节点的指针,这意味着可以在双向链表中向前或向后遍历。下面是C语言中如何实现双向链表的插入和删除操作的示例代码。
首先定义一个双向链表节点的结构体:
```
typedef struct node {
int data;
struct node* prev;
struct node* next;
} Node;
```
然后定义一个指向链表头节点和尾节点的指针变量:
```
Node* head = NULL;
Node* tail = NULL;
```
接下来是双向链表插入节点的示例代码:
```
void insertNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node)); // 分配一个新节点
newNode->data = data;
newNode->prev = NULL;
newNode->next = NULL;
if (head == NULL) { // 如果链表为空,将新节点作为头节点
head = newNode;
tail = newNode;
}
else { // 否则将新节点插入到链表尾部
tail->next = newNode;
newNode->prev = tail;
tail = newNode;
}
}
```
在上面的代码中,我们首先分配一个新的节点并将其初始化为指定的数据。然后,如果链表为空,则将新节点作为头节点,否则将新节点插入到链表的尾部。
接下来是双向链表删除节点的示例代码:
```
void deleteNode(Node* node) {
if (node == head) { // 如果删除的是头节点
head = node->next;
if (head != NULL) {
head->prev = NULL;
}
}
else if (node == tail) { // 如果删除的是尾节点
tail = node->prev;
if (tail != NULL) {
tail->next = NULL;
}
}
else { // 如果删除的是中间节点
node->prev->next = node->next;
node->next->prev = node->prev;
}
free(node); // 释放节点内存
}
```
在上面的代码中,我们首先检查要删除的节点是否是头节点或尾节点。如果是头节点,则将头指针指向下一个节点,如果下一个节点不为空,则将其前指针设置为NULL。如果是尾节点,则将尾指针指向前一个节点,如果前一个节点不为空,则将其后指针设置为NULL。如果删除的是中间节点,则将前一个节点的后指针指向下一个节点,将后一个节点的前指针指向前一个节点。最后,我们释放要删除的节点的内存。
阅读全文