对给定的单链表 L ,设计一个算法,删除 L 中值为 x 的结点的直接前驱结点。(C语言)
时间: 2024-10-05 22:01:55 浏览: 16
在C语言中,如果我们要删除单链表中值为x的节点的直接前驱节点,首先需要确保链表不是空的,并且目标节点的值确实存在。可以按照以下步骤编写算法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新节点
Node* createNode(int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode != NULL) {
newNode->data = value;
newNode->next = NULL;
}
return newNode;
}
// 删除值为x的节点的直接前驱节点
void deletePredecessor(Node** head, int x) {
if (*head == NULL || (*head)->data != x) {
// 如果头节点为空或者头节点不是目标值,直接返回
return;
}
// 找到目标节点(x的直接后继)
Node* current = *head;
while (current->next != NULL && current->next->data != x) {
current = current->next;
}
// 如果没找到目标节点,说明不存在该值
if (current->next == NULL) {
printf("Value %d not found in the list.\n", x);
return;
}
// 更新目标节点的前一个节点的next指针,使其跳过目标节点
current->next = current->next->next;
}
// 打印链表
void printList(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
// 初始化链表示例
Node* head = createNode(1);
head->next = createNode(2);
head->next->next = createNode(3);
head->next->next->next = createNode(x); // 替换为你要查找并删除的x
printf("Original List:\n");
printList(head);
deletePredecessor(&head, x); // 删除x的直接前驱
printf("\nList after deletion:\n");
printList(head);
return 0;
}
```
这个函数会在`main`中删除值为`x`的节点的直接前驱,然后打印出删除后的链表。记得替换`createNode(x)`中的`x`为实际需要查找和删除的值。