给定一个单链表A删除值大于Val(Val是用户的输入参数,其值可以和链表中元素相同也可以不同)的所有元素。 (1)完成链表的初始化; (2)完全给定元素的删除; (3)输出删除元素后的链表。C语言编程
时间: 2024-09-11 21:18:38 浏览: 30
在C语言中,你可以使用结构体表示链表节点,并通过迭代或递归的方式来实现这个功能。这里是一个简单的步骤描述:
1. **链表初始化**:
- 定义一个链表节点结构体 `struct ListNode`,包含一个整型数据域 `val` 和一个指向下一个节点的指针 `next`。
```c
struct ListNode {
int val;
struct ListNode* next;
};
```
2. **删除值大于 `Val` 的元素**:
- 创建一个函数 `deleteGreaterThanVal(struct ListNode* head, int Val)` 来处理这个操作。
- 初始化两个指针,一个 `p` 指向当前节点,另一个 `prev` 指向前一个节点(初始时,`prev` 为 `NULL`,`p` 为 `head`)。
- 遍历链表,如果当前节点 `p` 的值大于 `Val`,则删除它:
- 如果 `prev` 不为 `NULL`,将 `prev` 的 `next` 指向 `p->next`;
- 否则,`head` 就是指向 `p->next`。
- `prev` 或者 `p` 自身都更新到下一个节点。
```c
void deleteGreaterThanVal(struct ListNode* head, int Val) {
struct ListNode *prev = NULL, *current = head;
while (current != NULL) {
if (current->val > Val) {
if (prev == NULL) {
head = current->next;
} else {
prev->next = current->next;
}
free(current);
} else {
prev = current;
}
current = current->next;
}
}
```
3. **输出删除元素后的链表**:
- 删除完成后,如果你想打印链表,需要另外编写一个遍历函数,因为已经删除了一些节点。例如:
```c
void printList(struct ListNode* node) {
while (node != NULL) {
printf("%d ", node->val);
node = node->next;
}
printf("\n");
}
// 使用删除后的链表头调用此函数
printList(head);
```
阅读全文