已知一个带头结点的循环链表为list,设计一个算法,删除链表中数据域值为item的所有结点 用c语言解答
时间: 2024-09-25 17:03:45 浏览: 61
在C语言中,可以采用迭代的方式来遍历循环链表并删除值为`item`的节点。因为链表是循环的,我们需要额外记录当前节点的前一个节点,以便于更新指针后继续遍历。以下是具体的步骤:
```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;
while (current != NULL && current->data == item) { // 当前节点值等于item且不是头节点
if (prev == NULL) { // 链表开始处遇到item,需要更新头节点指针
*head = current->next;
} else {
prev->next = current->next; // 更新前一个节点的next指针跳过当前节点
}
current = current->next; // 移动到下一个节点
}
// 如果链表中还有其他值为item的节点,这里还需要处理循环情况
while (current != *head) {
if (current->data == item) {
prev->next = current->next; // 同样更新前一个节点的next指针跳过当前节点
}
current = current->next;
}
}
// 添加示例
Node* insert(Node* head, int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = head;
if (head != NULL) {
head->next->next = newNode; // 循环链表的特点,最后一个节点连接新节点
} else {
head = newNode; // 如果链表为空,newNode即为头节点
}
return head;
}
int main() {
Node* list = NULL; // 假设已创建好一个循环链表
// 插入一些节点,然后尝试删除特定值的节点
for (int i = 0; i < 5; ++i) {
list = insert(list, i);
}
int itemToRemove = 3; // 想要删除的数据
deleteNodes(&list, itemToRemove);
// 输出处理后的链表节点
Node* temp = list;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
return 0;
}
```
阅读全文