用C语言写一个 以字符为数据的双向循环链表,并可以插入删除
时间: 2023-04-05 09:03:57 浏览: 70
可以回答这个问题。以下是一个简单的双向循环链表的 C 代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
char data;
struct node *prev;
struct node *next;
} Node;
Node *create_node(char 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, char data) {
Node *new_node = create_node(data);
if (*head == NULL) {
*head = new_node;
(*head)->prev = *head;
(*head)->next = *head;
} else {
new_node->prev = (*head)->prev;
new_node->next = *head;
(*head)->prev->next = new_node;
(*head)->prev = new_node;
}
}
void delete_node(Node **head, char data) {
if (*head == NULL) {
return;
}
Node *curr = *head;
do {
if (curr->data == data) {
if (curr == *head) {
*head = (*head)->next;
}
curr->prev->next = curr->next;
curr->next->prev = curr->prev;
free(curr);
return;
}
curr = curr->next;
} while (curr != *head);
}
void print_list(Node *head) {
if (head == NULL) {
printf("List is empty.\n");
return;
}
Node *curr = head;
do {
printf("%c ", curr->data);
curr = curr->next;
} while (curr != head);
printf("\n");
}
int main() {
Node *head = NULL;
insert_node(&head, 'a');
insert_node(&head, 'b');
insert_node(&head, 'c');
print_list(head);
delete_node(&head, 'b');
print_list(head);
return 0;
}
```
这个代码示例定义了一个 `Node` 结构体,包含一个字符数据、一个指向前一个节点的指针和一个指向后一个节点的指针。`create_node` 函数用于创建一个新节点,`insert_node` 函数用于在链表头部插入一个新节点,`delete_node` 函数用于删除链表中第一个包含指定字符数据的节点,`print_list` 函数用于打印整个链表。在 `main` 函数中,我们创建了一个空链表,插入了三个节点,打印了整个链表,然后删除了一个节点,再次打印了整个链表。