循环双向链表的c语言实现
时间: 2023-08-02 07:42:40 浏览: 117
循环双向链表是一种链表结构,它可以在单链表的基础上,增加一个指向前一个结点的指针,从而实现双向遍历。循环双向链表是指尾结点的 next 指针指向头结点,头结点的 prev 指针指向尾结点,形成一个循环。
以下是循环双向链表的 C 语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *prev;
struct Node *next;
} Node;
Node *create_node(int data) {
Node *new_node = (Node *)malloc(sizeof(Node));
new_node->data = data;
new_node->prev = NULL;
new_node->next = NULL;
return new_node;
}
void insert_node(Node **head, Node *new_node) {
if (*head == NULL) {
*head = new_node;
(*head)->prev = new_node;
(*head)->next = new_node;
} else {
Node *tail = (*head)->prev;
tail->next = new_node;
new_node->prev = tail;
new_node->next = *head;
(*head)->prev = new_node;
}
}
void delete_node(Node **head, Node *del_node) {
if (*head == NULL || del_node == NULL) {
return;
}
if (*head == del_node) {
*head = del_node->next;
}
if (del_node->next != NULL) {
del_node->next->prev = del_node->prev;
}
if (del_node->prev != NULL) {
del_node->prev->next = del_node->next;
}
free(del_node);
}
void print_list(Node *head) {
if (head == NULL) {
printf("List is empty\n");
} else {
Node *current = head;
do {
printf("%d ", current->data);
current = current->next;
} while (current != head);
printf("\n");
}
}
int main() {
Node *head = NULL;
Node *node1 = create_node(1);
Node *node2 = create_node(2);
Node *node3 = create_node(3);
insert_node(&head, node1);
insert_node(&head, node2);
insert_node(&head, node3);
print_list(head);
delete_node(&head, node2);
print_list(head);
return 0;
}
```
在上面的代码中,我们定义了一个 Node 结构体,表示循环双向链表的结点。create_node 函数用于创建一个新结点,insert_node 函数用于将新结点插入链表,delete_node 函数用于删除指定结点,print_list 函数用于打印链表。
在 main 函数中,我们创建了三个结点,然后插入链表,打印链表,删除第二个结点,再次打印链表。
阅读全文