设在一个带头节点的单链表中所有元素结点的数值无序,试编写一个函数,删除表中所有介于给定的两个值(作为函数参数给出)之间的元素的元素(若存在),用c语言
时间: 2024-09-29 14:03:10 浏览: 26
在C语言中,你可以创建一个函数来删除链表中所有介于给定值之间的元素。首先,我们需要定义链表结构体、头指针以及一些辅助函数,如插入和遍历链表。下面是一个简单的示例:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
Node* createNode(int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = NULL;
return newNode;
}
void insert(Node** head, int value) {
if (*head == NULL) {
*head = createNode(value);
} else {
Node* current = *head;
while (current->next != NULL && current->next->data < value) {
current = current->next;
}
current->next = createNode(value);
}
}
// 删除节点
void deleteNodes(Node** head, int lower, int upper) {
if (*head == NULL) {
return;
}
// 遍历链表
Node* current = *head;
Node* prev = NULL;
while (current != NULL) {
// 如果当前节点不在指定范围内,则移动到下一个节点
if (current->data < lower || current->data > upper) {
if (prev != NULL) {
prev->next = current->next;
} else {
*head = current->next;
}
free(current);
current = current->next;
} else { // 找到在范围内的节点,跳过它
prev = current;
current = current->next;
}
}
}
// 打印链表
void printList(Node* head) {
while (head != NULL) {
printf("%d -> ", head->data);
head = head->next;
}
printf("NULL\n");
}
int main() {
Node* head = NULL;
// 插入一些节点
insert(&head, 5); // 示例:[5]
insert(&head, 2); // 示例:[2, 5]
insert(&head, 7); // 示例:[2, 5, 7]
insert(&head, 4); // 示例:[2, 4, 5, 7]
int lower = 3, upper = 6; // 范围 [3, 6)
printf("Original list before deletion:\n");
printList(head);
deleteNodes(&head, lower, upper);
printf("\nList after deleting elements between %d and %d:\n", lower, upper);
printList(head);
return 0;
}
```
这个程序首先创建了一个单链表,然后使用`deleteNodes`函数删除了指定范围内的所有节点。注意,这个函数会直接修改原始链表。在`main`函数中,我们展示了如何在链表中插入元素,并在删除操作之后打印出新的链表状态。
阅读全文