c语言构建一个双向循环链表
时间: 2023-12-25 21:56:49 浏览: 99
C语言 双向循环链表
下面是一个简单的C语言代码示例,用于构建一个双向循环链表:
```c
#include <stdio.h>
#include <stdlib.h>
/* 定义链表节点结构体 */
typedef struct node {
int data;
struct node *prev;
struct node *next;
} Node;
/* 初始化链表 */
void init_list(Node **head) {
*head = NULL;
}
/* 创建新节点 */
Node *create_node(int data) {
Node *new_node = (Node *)malloc(sizeof(Node));
if (new_node == NULL) {
printf("Error: memory allocation failed!\n");
exit(1);
}
new_node->data = data;
new_node->prev = NULL;
new_node->next = NULL;
return new_node;
}
/* 将节点插入链表尾部 */
void insert_tail(Node **head, Node *new_node) {
if (*head == NULL) {
/* 如果链表为空,则新节点就是头结点 */
*head = new_node;
(*head)->prev = *head;
(*head)->next = *head;
} else {
/* 找到链表尾部节点,将新节点插入其后面 */
Node *tail = (*head)->prev;
new_node->prev = tail;
new_node->next = *head;
tail->next = new_node;
(*head)->prev = new_node;
}
}
/* 将节点插入链表头部 */
void insert_head(Node **head, Node *new_node) {
if (*head == NULL) {
/* 如果链表为空,则新节点就是头结点 */
*head = new_node;
(*head)->prev = *head;
(*head)->next = *head;
} else {
/* 将新节点插入头结点之前 */
Node *old_head = *head;
new_node->prev = old_head->prev;
new_node->next = old_head;
old_head->prev->next = new_node;
old_head->prev = new_node;
*head = new_node;
}
}
/* 删除指定节点 */
void delete_node(Node **head, Node *node) {
if (*head == NULL || node == NULL) {
/* 链表为空或指定节点为空,直接返回 */
return;
}
if (*head == node) {
/* 如果要删除的是头结点,则将新的头结点指向下一个节点 */
*head = node->next;
}
node->prev->next = node->next;
node->next->prev = node->prev;
free(node);
}
/* 打印链表元素 */
void print_list(Node *head) {
if (head == NULL) {
printf("List is empty!\n");
return;
}
printf("List: ");
Node *p = head;
do {
printf("%d ", p->data);
p = p->next;
} while (p != head);
printf("\n");
}
/* 主函数 */
int main() {
Node *head;
init_list(&head);
/* 创建新节点并插入链表尾部 */
Node *node1 = create_node(1);
insert_tail(&head, node1);
print_list(head);
/* 创建新节点并插入链表头部 */
Node *node2 = create_node(2);
insert_head(&head, node2);
print_list(head);
/* 创建新节点并插入链表头部 */
Node *node3 = create_node(3);
insert_head(&head, node3);
print_list(head);
/* 删除节点2 */
delete_node(&head, node2);
print_list(head);
/* 删除节点1 */
delete_node(&head, node1);
print_list(head);
/* 删除节点3 */
delete_node(&head, node3);
print_list(head);
return 0;
}
```
该程序定义了一个节点结构体,包括数据、前驱节点和后继节点三个成员。然后定义了几个链表操作函数,包括初始化链表、创建新节点、插入节点到链表尾部、插入节点到链表头部、删除指定节点和打印链表元素。主函数中通过这些操作函数构建了一个双向循环链表,并进行了一些操作,最终输出链表的元素。
阅读全文