编写程序,要求完成以下需求: 1.输入若干正整数,按从小到大次序建立1个带头结点单链表并输出该有序链表 2.程序中要求设计一个实现单链表分离算法的Split函数,将原单链表中值为偶数的结点分离出来
时间: 2024-10-07 21:07:42 浏览: 65
首先,我们来创建一个简单的单链表结构,包含一个头节点和数据域,并实现插入和排序功能。我们可以使用C++来编写这个程序,以下是基础的部分:
```cpp
#include <iostream>
using namespace std;
// 定义链表节点结构
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
// 单链表类,包含插入、排序等方法
class LinkedList {
private:
ListNode* head;
public:
LinkedList() : head(nullptr) {}
// 插入元素
void insert(int value) {
ListNode* newNode = new ListNode(value);
if (!head) {
head = newNode;
} else {
ListNode* current = head;
while (current->next && current->next->val < value) {
current = current->next;
}
newNode->next = current->next;
current->next = newNode;
}
}
// 排序链表(这里假设已按照顺序插入)
void sortList() {
// 链表本身已经有序,无需额外操作
}
// 打印链表
void printList() {
ListNode* temp = head;
while (temp) {
cout << temp->val << " ";
temp = temp->next;
}
cout << endl;
}
// 分离奇偶节点的辅助函数
ListNode* splitEvenNodes(ListNode* start) {
if (!start || !start->next) return start;
ListNode* oddNode = start;
ListNode* evenNode = start->next;
while (evenNode && evenNode->next) {
oddNode->next = evenNode->next;
evenNode->next = evenNode->next->next;
if (evenNode->next) {
oddNode = oddNode->next;
evenNode = evenNode->next;
}
}
oddNode->next = nullptr; // 如果evenNode到达了链表尾部,将剩余部分连接回oddNode
return start;
}
};
int main() {
LinkedList list;
int n;
cout << "请输入正整数的数量:";
cin >> n;
for (int i = 0; i < n; ++i) {
int value;
cout << "请输入第" << (i+1) << "个数字:";
cin >> value;
list.insert(value);
}
cout << "原始链表排序前:";
list.printList();
list.sortList(); // 这里实际不需要,因为已经按序插入
cout << "排序后的链表:";
list.printList();
ListNode* separatedList = list.splitEvenNodes(list.head);
cout << "分离后的偶数链表:";
while (separatedList) {
cout << separatedList->val << " ";
separatedList = separatedList->next;
}
cout << endl;
return 0;
}
```
在这个程序中,用户可以输入一系列正整数,然后构建一个有序链表。之后调用`splitEvenNodes`函数,会返回一个新的链表,其中包含所有的偶数结点。`main`函数中展示了整个流程。
阅读全文