在带头结点的单链表L中,删除所有值为x的结点,并释放其空间,假设值为x的结点不唯一,试编写算法以实现上述操作,用c语言
时间: 2024-10-10 22:02:51 浏览: 19
链表-使用C语言实现带头结点的单链表.zip
在C语言中,我们可以使用迭代的方式来遍历链表并删除值为x的节点。这里是一个简单的示例算法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (!newNode) {
printf("Memory allocation failed.\n");
return NULL;
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 删除链表中值为x的节点
void deleteNodesWithValue(Node** head, int x) {
Node* current = *head;
Node* temp = NULL;
// 如果头节点就是我们要删除的节点
while (current != NULL && current->data == x) {
temp = current;
current = current->next;
free(temp); // 释放内存
}
// 遍历链表,处理剩余节点
while (current != NULL) {
if (current->data == x) {
temp = current; // 记录当前节点
current = current->next; // 移动到下一个节点
free(temp); // 删除该节点并释放内存
} else {
temp->next = current; // 继续传递非目标节点
temp = current;
current = current->next;
}
}
*head = current; // 更新头节点,指向新链表的第一个节点
}
// 打印链表
void printList(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
Node* listHead = createNode(10); // 示例链表 [10 -> x -> y -> z -> x -> x]
listHead->next = createNode(5); // 假设x = 5
listHead->next->next = createNode(7);
listHead->next->next->next = createNode(x); // 其他值为x的节点
listHead->next->next->next->next = createNode(8);
printf("Original List:\n");
printList(listHead);
int valueToDelete = 5; // 要删除的值
deleteNodesWithValue(&listHead, valueToDelete);
printf("\nList after deleting nodes with value %d:\n", valueToDelete);
printList(listHead);
return 0;
}
```
阅读全文