双向循环链表的基本操作c语言
时间: 2024-09-16 15:06:18 浏览: 69
双向循环链表是一种特殊的链表数据结构,每个节点不仅有一个指向下一个节点的指针,还有一个指向前一个节点的指针,形成一个首尾相连的环形。在C语言中,基本操作包括:
1. **创建节点**:创建一个新的节点并初始化其数据域和两个指针(next和prev),如果是头节点,prev将指向自身。
```c
typedef struct Node {
int data;
struct Node* next;
struct Node* prev;
} Node;
Node* createNode(int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = newNode->prev = newNode; // 对于循环链表,prev总是指向next
return newNode;
}
```
2. **插入节点**:可以分别在链表头部、尾部或指定位置插入新节点。例如,在头部插入:
```c
void insertAtHead(Node** head, int value) {
Node* newNode = createNode(value);
if (*head != NULL) {
newNode->prev = *head;
(*head)->next = newNode;
}
*head = newNode;
}
```
3. **删除节点**:删除节点需要找到前一个节点,并更新它的`next`和`prev`指针。注意这里因为是循环链表,删除某个节点之后要特别处理头节点的情况。
```c
void deleteNode(Node** head, int value) {
Node* current = *head;
while (current != NULL && current->data != value) {
current = current->next;
}
if (current == NULL) return; // 没有找到节点
if (current->prev == current->next) { // 删除头节点
*head = NULL;
} else {
current->prev->next = current->next;
current->next->prev = current->prev;
}
free(current); // 释放内存
}
```
4. **遍历**:由于是循环结构,可以像普通链表一样从头开始到尾,然后从尾部返回到头部继续遍历,直到遇到第一个已访问过的节点。
```c
void traverse(Node* head) {
Node* temp = head;
do {
printf("%d ", temp->data);
temp = temp->next;
} while (temp != head);
}
```
阅读全文