C语言,给定一个单链表A删除值大于Val(Val是用户的输入参数,其值可以和链表中元素相同也可以不同)的所有元素。 (1)完成链表的初始化; (2)完全给定元素的删除; (3)输出删除元素后的链表。
时间: 2024-09-12 08:06:42 浏览: 44
在C语言中,你可以采用以下几个步骤来实现这个功能:
1. **链表初始化**:
首先,你需要定义一个链表节点结构,包括数据域和指向下一个节点的指针。对于初始化,假设链表中的所有元素都是正整数,你可以创建一个静态或动态生成的链表。
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建链表
void createList(Node** head, int size, int val) {
Node* temp = *head;
for (int i = 0; i < size; ++i) {
temp = (Node*)malloc(sizeof(Node));
temp->data = i + 1;
temp->next = (i+1 == size-1) ? NULL : (Node*)malloc(sizeof(Node)); // 尾部节点不需要next
if (temp->data <= val)
temp->next = *head;
*head = temp;
}
}
```
2. **删除元素**:
使用迭代法,遍历链表,当遇到的节点值大于`val`时,跳过这个节点。
```c
// 删除值大于val的节点
void deleteGreaterThan(Node** head, int val) {
Node* prev = NULL;
Node* curr = *head;
while (curr != NULL) {
if (curr->data > val) {
if (prev == NULL) { // 当前节点是头节点
*head = curr->next;
} else {
prev->next = curr->next;
}
free(curr); // 释放内存
} else {
prev = curr;
}
curr = curr->next;
}
}
```
3. **输出删除元素后的链表**:
最后,打印出链表内容即可。由于链表操作通常只保留最后一个节点的地址,你可以递归地打印每个节点的数据直到链表结束。
```c
// 打印链表
void printList(Node* node) {
if (node == NULL)
return;
printf("%d -> ", node->data);
printList(node->next);
}
int main() {
int size, val;
printf("Enter the number of elements and the value to compare with: ");
scanf("%d %d", &size, &val);
Node* head = NULL;
createList(&head, size, val);
printf("Original List (before deletion): ");
printList(head);
deleteGreaterThan(&head, val);
printf("\nList after deleting values greater than %d: ", val);
printList(head);
return 0;
}
```
以上就是完整的C语言代码,可以根据需求调整输入部分,比如让用户在运行时输入`size`和`val`的值。
阅读全文