删除小于x的元素 描述 设有一个正整数序列组成的有序单链表,现在输入一个x值,然后,删除单链表中小于x的值。 输入 第一行:输入一组整数。 第二行:输入x值。 输出 第一行,输出删除前的单链表。 第二行:输出删除后的单链表。 写c语言和c++
时间: 2024-09-18 22:14:59 浏览: 52
在 C 语言中,你可以创建一个结构体表示链表节点,并编写函数来实现这个功能。以下是使用 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));
if (!newNode) {
printf("Memory allocation failed.\n");
return NULL;
}
newNode->data = value;
newNode->next = NULL;
return newNode;
}
void insertSorted(Node** head, int value) {
Node* temp = *head;
if (temp == NULL || temp->data >= value) {
newNode->next = *head;
*head = newNode;
} else {
while (temp->next != NULL && temp->next->data < value) {
temp = temp->next;
}
newNode->next = temp->next;
temp->next = newNode;
}
}
void deleteElementsBelowX(Node** head, int x) {
if (*head == NULL) {
return;
}
Node* current = *head;
Node* prev = NULL;
while (current != NULL && current->data < x) {
prev = current;
current = current->next;
free(prev);
}
if (prev != NULL) {
prev->next = current;
} else {
*head = current;
}
}
// 输出链表
void printList(Node* node) {
while (node != NULL) {
printf("%d -> ", node->data);
node = node->next;
}
printf("NULL\n");
}
int main() {
Node* head = NULL;
int values[] = {5, 3, 8, 4, 7, 9};
int n = sizeof(values) / sizeof(values[0]);
int x;
// 插入初始链表元素
for (int i = 0; i < n; i++) {
head = createNode(values[i]);
insertSorted(&head, values[i]);
}
printf("Original List:\n");
printList(head);
scanf("%d", &x);
deleteElementsBelowX(&head, x);
printf("\nList after deleting elements below %d:\n", x);
printList(head);
return 0;
}
```
在 C++ 中,可以使用相似的思路,只是语法稍微调整一下:
```cpp
#include <iostream>
#include <vector>
using namespace std;
struct Node {
int data;
Node* next;
};
void insertSorted(vector<Node*>& nodes, int value) {
Node* newNode = new Node{value, nullptr};
auto it = nodes.begin();
while (it != nodes.end() && it->data >= value) {
++it;
}
newNode->next = it;
nodes.insert(it, newNode);
}
void deleteElementsBelowX(vector<Node*>& nodes, int x) {
auto it = nodes.begin();
while (it != nodes.end() && it->data < x) {
delete it;
it = nodes.erase(it);
}
}
// 输出链表
void printList(const vector<Node*>& nodes) {
for (const auto& node : nodes) {
cout << node->data << " -> ";
}
cout << "NULL\n";
}
int main() {
vector<Node*> head({5, 3, 8, 4, 7, 9});
int x;
cout << "Original List:\n";
printList(head);
cin >> x;
deleteElementsBelowX(head, x);
cout << "\nList after deleting elements below " << x << ":\n";
printList(head);
return 0;
}
```
阅读全文