用c语言建立双向链表,并在双向链表上实现插入、删除和查找操作
时间: 2024-05-16 13:16:52 浏览: 172
下面是一个简单的双向链表的C语言实现,包括插入、删除和查找操作。
```c
#include <stdio.h>
#include <stdlib.h>
// 双向链表结构体
typedef struct Node {
int val; // 节点的值
struct Node *prev; // 指向前一个节点的指针
struct Node *next; // 指向后一个节点的指针
} Node;
// 创建新节点
Node* createNode(int val) {
Node *node = (Node*) malloc(sizeof(Node));
node->val = val;
node->prev = NULL;
node->next = NULL;
return node;
}
// 在链表头部插入节点
void insertAtHead(Node **head, int val) {
Node *node = createNode(val);
if (*head == NULL) {
*head = node;
} else {
node->next = *head;
(*head)->prev = node;
*head = node;
}
}
// 在链表尾部插入节点
void insertAtTail(Node **head, int val) {
Node *node = createNode(val);
if (*head == NULL) {
*head = node;
} else {
Node *cur = *head;
while (cur->next != NULL) {
cur = cur->next;
}
cur->next = node;
node->prev = cur;
}
}
// 删除节点
void deleteNode(Node **head, int val) {
if (*head == NULL) {
return;
}
Node *cur = *head;
while (cur != NULL) {
if (cur->val == val) {
if (cur->prev != NULL) {
cur->prev->next = cur->next;
} else {
*head = cur->next;
}
if (cur->next != NULL) {
cur->next->prev = cur->prev;
}
free(cur);
return;
}
cur = cur->next;
}
}
// 查找节点
Node* searchNode(Node *head, int val) {
Node *cur = head;
while (cur != NULL) {
if (cur->val == val) {
return cur;
}
cur = cur->next;
}
return NULL;
}
// 打印链表
void printList(Node *head) {
Node *cur = head;
while (cur != NULL) {
printf("%d ", cur->val);
cur = cur->next;
}
printf("\n");
}
int main() {
Node *head = NULL;
insertAtHead(&head, 1);
insertAtTail(&head, 2);
insertAtTail(&head, 3);
insertAtHead(&head, 4);
printList(head); // 输出 4 1 2 3
deleteNode(&head, 2);
printList(head); // 输出 4 1 3
Node *node = searchNode(head, 1);
if (node != NULL) {
printf("Found %d\n", node->val); // 输出 Found 1
} else {
printf("Not found\n");
}
return 0;
}
```
注意,这里的双向链表是使用头指针来维护的,也就是说,head指向链表的头节点。这样做的好处是,插入和删除操作都可以通过修改head指针来实现。同时,由于链表是双向的,因此每个节点都有一个指向前一个节点的指针prev。
另外,我们还定义了一个createNode函数来创建新节点,这个函数在插入和删除操作中都会用到。
阅读全文