用c语言实现已知带头结点的非递减单链表L(假设链表中数据都是整数),编写一个函数删除L中所有值大于mink且小于maxk的结点(mink<maxk),函数返回删除结点的总个数。
时间: 2024-11-15 22:32:32 浏览: 3
在C语言中,我们可以使用一个辅助指针来遍历链表并计数删除的操作。以下是一个简单的函数设计:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 插入节点到链表末尾
Node* insert(Node** head, int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("Memory allocation failed.\n");
return NULL;
}
newNode->data = value;
newNode->next = (*head);
(*head) = newNode;
return newNode;
}
// 删除满足条件的节点并返回删除的节点总数
int deleteNodes(Node** head, int mink, int maxk) {
Node* current = *head;
int count = 0;
while (current != NULL) {
// 如果当前节点的数据不在指定范围内,则移动指针
if (current->data > maxk || current->data < mink) {
current = current->next;
continue;
}
// 记录并将当前节点从链表中移除
Node* temp = current;
current = current->next;
free(temp);
count++;
}
return count;
}
// 示例链表初始化
void createLinkedList(Node** head, ...) {
int values[] = {5, 3, 8, 1, 9, 6, 4};
int size = sizeof(values) / sizeof(values[0]);
for (int i = 0; i < size; ++i) {
insert(head, values[i]);
}
}
int main() {
Node* head = NULL;
createLinkedList(&head, 5, 3, 8, 1, 9, 6, 4); // 假设这是初始链表
int mink = 3, maxk = 7;
int deletedCount = deleteNodes(&head, mink, maxk);
printf("Deleted %d nodes with values between %d and %d.\n", deletedCount, mink, maxk);
return 0;
}
```
在这个例子中,`deleteNodes` 函数会遍历链表,如果遇到值在 `mink` 和 `maxk` 之间的节点,就将其删除并增加计数器。主函数中创建了一个示例链表,并显示了删除的节点数量。
阅读全文