C语言实现链表中删除值为x的节点
以下是使用C语言实现在链表中删除值为x的结点的函数:
#include <stdio.h>
#include <stdlib.h>
// 定义单链表节点的结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 在链表中删除值为x的结点
void deleteNode(Node** head, int x) {
Node* current = *head;
Node* prev = NULL;
// 遍历链表,找到值为x的结点及其前驱结点
while (current != NULL && current->data != x) {
prev = current;
current = current->next;
}
// 若找到了值为x的结点,删除它
if (current != NULL) {
if (prev == NULL) {
// 若删除的是头结点,则移动头指针
*head = current->next;
} else {
// 若删除的是中间结点,则更新前驱结点的next指针
prev->next = current->next;
}
// 释放删除结点的内存
free(current);
}
}
// 创建链表
Node* createLinkedList(int arr[], int n) {
Node* head = NULL;
Node* tail = NULL;
for (int i = 0; i < n; i++) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = arr[i];
newNode->next = NULL;
if (head == NULL) {
head = newNode;
tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
return head;
}
// 打印链表
void printLinkedList(Node* head) {
Node* current = head;
while (current != NULL) {
printf('%d ', current->data);
current = current->next;
}
printf('\n');
}
// 销毁链表
void destroyLinkedList(Node* head) {
Node* current = head;
Node* next = NULL;
while (current != NULL) {
next = current->next;
free(current);
current = next;
}
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
Node* head = createLinkedList(arr, n);
printf("原始链表:");
printLinkedList(head);
int x = 3;
deleteNode(&head, x);
printf("删除值为%d的结点后的链表:", x);
printLinkedList(head);
destroyLinkedList(head);
return 0;
}
以上代码实现了在链表中删除值为x的结点的逻辑。首先定义了单链表节点的结构体,然后实现了deleteNode函数来删除链表中值为x的节点。主函数中创建了一个链表,并打印出原始链表。然后调用deleteNode函数删除值为x的节点,并打印删除节点后的链表。最后销毁链表,释放内存。
原文地址: https://www.cveoy.top/t/topic/oMA 著作权归作者所有。请勿转载和采集!