c语言双向链表的练习
时间: 2024-10-18 09:01:43 浏览: 35
双向链表实现贪吃蛇游戏(C语言版)
在C语言中,双向链表是一种数据结构,每个节点包含两个指针,一个指向前一个节点,另一个指向后一个节点。这使得可以方便地从头到尾遍历列表,也可以很容易地在任意位置插入和删除节点。以下是创建和操作双向链表的一些基本步骤:
1. 定义链表节点结构体:
```c
typedef struct Node {
int data; // 节点存储的数据
struct Node* prev; // 指向前一个节点
struct Node* next; // 指向下一个节点
} Node;
```
2. 创建链表:
- 初始化链表为空:`Node* head = NULL;`
- 插入新节点:创建新节点,如果头节点为空则设置头为新节点,否则将新节点链接到当前头之后。
3. 插入、删除和访问节点:
- 插入:在指定位置添加新节点,调整前驱和后继指针。
- 删除:找到要删除的节点,更新前后节点的指针。
- 访问:通过遍历链表,使用`prev->next` 和 `next->prev` 来移动指针并访问节点值。
4. 遍历链表:
- 常见的遍历方式有单向前序遍历(头插法)、单向后序遍历(尾插法)以及双指针法(同时遍历前后节点)。
5. 示例代码片段(仅提供基础框架):
```c
// 插入节点
void insert(Node** head, int data, int position) {
if (position == 0) {
Node* newNode = malloc(sizeof(Node));
newNode->data = data;
newNode->prev = NULL;
newNode->next = *head;
if (*head != NULL) (*head)->prev = newNode;
*head = newNode;
} else {
// 更复杂的情况,需要遍历查找位置
}
}
// 删除节点
void deleteNode(Node** head, int data) {
Node* current = *head;
while (current != NULL && current->data != data) {
current = current->next;
}
if (current == NULL) return; // 数据未找到
if (current->prev != NULL) {
current->prev->next = current->next;
} else {
*head = current->next;
}
if (current->next != NULL) {
current->next->prev = current->prev;
}
free(current);
}
```
阅读全文