c语言题目:单链表的删除操作 描述:给定一个单链表A删除值大于Val(Val是用户的输入参数,其值可以和链表中元素相同也可以不同)的所有元素。 (1)完成链表的初始化; (2)完全给定元素的删除; (3)输出删除元素后的链表。
时间: 2024-09-11 07:19:18 浏览: 23
在 C 语言中,删除单链表中所有大于给定值 Val 的元素通常涉及以下几个步骤:
1. **链表初始化**:
首先,你需要创建一个头结点,然后通过 `malloc` 分配内存创建节点,将头结点的指针设置为头结点本身,如果用户输入的值小于链表的第一个元素,则不需要处理。
```c
typedef struct Node {
int data;
struct Node* next;
} Node;
Node* createList() {
Node* head = (Node*) malloc(sizeof(Node));
head->data = -1; // 初始化头结点,一般设为哨兵或较小值
head->next = NULL;
return head;
}
```
2. **删除操作**:
使用一个迭代或递归的方式遍历链表。对于每个节点,检查它的数据是否大于 Val,如果是,就跳过该节点并继续到下一个。如果不是,更新当前节点的 next 指向下一个节点,并释放当前节点以节省空间。
```c
void deleteGreaterThan(Node** head, int val) {
if (*head == NULL) return;
Node* curr = *head;
Node* prev = NULL;
while (curr != NULL && curr->data > val) {
prev = curr;
curr = curr->next;
free(curr); // 删除节点
}
if (prev == NULL) *head = curr; // 如果第一个节点需要删除,更新头结点
else prev->next = curr; // 更新前一个节点的 next 指向新位置
}
```
3. **输出链表**:
最后,你可以选择直接打印链表的节点数据,或者用函数遍历并打印出来。
```c
void printList(Node* node) {
while (node != NULL) {
printf("%d -> ", node->data);
node = node->next;
}
printf("NULL\n");
}
// 调用示例
int main() {
Node* list = createList();
// ... 添加元素至list
int val = 用户输入的值;
deleteGreaterThan(&list, val);
printList(list);
return 0;
}
```