在带头结点的单链表L中,删除所有值为x的结点,并释放其空间,假设值为x的结点不唯一,试编写算法以实现上述操作。C语言
时间: 2024-10-10 19:02:04 浏览: 45
在C语言中,我们可以使用迭代的方式来遍历链表并删除值为`x`的所有节点。这里是一个简单的算法实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 删除值为x的节点
void deleteNodes(Node** head, int x) {
// 避免在头节点为空的情况下出错
if (*head == NULL) return;
Node* temp = *head;
Node* prev = NULL;
// 遍历链表
while (temp != NULL) {
// 如果当前节点的数据等于x
if (temp->data == x) {
// 更新前一个节点的next指针,跳过当前节点
if (prev == NULL) {
*head = temp->next; // 如果是头节点,更新为下一个节点
} else {
prev->next = temp->next;
}
// 释放当前节点内存
free(temp);
temp = prev->next;
} else {
// 否则,前进到下一个节点
prev = temp;
temp = temp->next;
}
}
}
// 示例链表创建函数
Node* createList(int arr[], int size) {
Node* head = NULL;
for (int i = 0; i < size; ++i) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = arr[i];
newNode->next = head;
head = newNode;
}
return head;
}
int main() {
int arr[] = {1, 2, 3, 4, 5, 2, 6, 2};
int size = sizeof(arr) / sizeof(arr[0]);
Node* list = createList(arr, size);
int valueToRemove = 2;
deleteNodes(&list, valueToRemove);
Node* curr = list;
while (curr != NULL) {
printf("%d ", curr->data);
curr = curr->next;
}
// 打印结果并清理链表
printf("\n");
return 0;
}
```
阅读全文