给定一个单链表A删除值大于Val(Val是用户的输入参数,其值可以和链表中元素相同也可以不同)的所有元素。用c语言实现,要求第一行输入链表的元素,第二行输出Val的值
时间: 2024-09-11 17:18:33 浏览: 48
在C语言中,我们可以使用结构体来定义一个单链表节点,然后通过循环遍历链表的方式来删除所有值大于用户输入参数Val的节点。以下是一个简单的实现示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义单链表节点结构体
struct ListNode {
int val;
struct ListNode *next;
};
// 创建新节点
struct ListNode* createNode(int val) {
struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
if (!newNode) return NULL;
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// 删除链表中值大于Val的节点
void deleteNodesGreaterThanVal(struct ListNode** head, int val) {
struct ListNode *temp = *head, *prev = NULL;
while (temp != NULL) {
if (temp->val > val) {
if (prev == NULL) {
// 如果是头部节点,则移动头指针
*head = temp->next;
free(temp);
temp = *head;
} else {
// 如果不是头部节点,则删除当前节点
prev->next = temp->next;
free(temp);
temp = prev->next;
}
} else {
// 如果当前节点值不大于Val,则移动prev指针
prev = temp;
temp = temp->next;
}
}
}
// 打印链表
void printList(struct ListNode *head) {
while (head != NULL) {
printf("%d ", head->val);
head = head->next;
}
printf("\n");
}
// 主函数
int main() {
int n, val, x;
struct ListNode* head = NULL;
// 读取链表元素个数
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &x);
// 读取链表元素,并构建链表
struct ListNode* newNode = createNode(x);
newNode->next = head;
head = newNode;
}
// 读取Val的值
scanf("%d", &val);
// 删除链表中大于Val的节点
deleteNodesGreaterThanVal(&head, val);
// 打印修改后的链表
printList(head);
// 释放链表内存
while (head != NULL) {
struct ListNode* temp = head;
head = head->next;
free(temp);
}
return 0;
}
```
这段代码首先定义了链表节点的结构体,然后定义了创建新节点、删除大于特定值的节点、以及打印链表的函数。在主函数中,首先读取用户输入的链表元素和要删除的值Val,然后根据用户输入的值删除链表中相应的节点,并输出修改后的链表。
阅读全文