已知一个带头结点的循环链表为list,设计一个算法,删除链表中数据域值为item的所有结点,C语言代码是什么
时间: 2024-10-22 12:29:49 浏览: 42
在C语言中,我们可以使用迭代的方式来遍历循环链表并删除值为`item`的节点。由于链表是循环的,我们需要特别处理指针在删除最后一个节点后的指向问题。以下是相应的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 删除所有值为item的节点
void deleteNodes(Node** head, int item) {
Node* current = *head; // 初始化当前指针
Node* prev = NULL; // 上一个节点
Node* temp;
while (current != NULL && current->data == item) { // 遍历直到找到非item节点或者到达头结点
if (prev == NULL) { // 如果是第一个节点
*head = current->next; // 更新头结点为下一个节点
} else {
prev->next = current->next; // 将前一个节点的next指向前一个节点的下一个节点
}
temp = current; // 保存当前节点
current = current->next; // 移动到下一个节点
free(temp); // 释放当前节点的内存
}
}
// 循环链表打印函数
void printList(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("...\n");
}
int main() {
// 创建循环链表示例
Node* list = createCycleList(); // 这里假设createCycleList()函数已经创建了循环链表
int item = 5; // 要删除的数据值
printf("Original list:\n");
printList(list);
deleteNodes(&list, item);
printf("List after deleting all items with value %d:\n", item);
printList(list);
return 0;
}
```
注意:这个代码片段假设有一个名为`createCycleList()`的辅助函数用于构造循环链表。你需要根据实际情况提供这个函数。
阅读全文