提供详细的源码,用 C++ 实现对链表中的数字进行升序排序的完整代码

以下是用 C++ 实现对链表中的数字进行升序排序的完整代码,你可以直接运行:

//cpp
#include
using namespace std;

// 定义链表节点结构体
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};

// 打印链表
void printList(ListNode* head) {
while (head != nullptr) {
cout << head->val << " ";
head = head->next;
}
cout << endl;
}

// 插入排序算法对链表进行升序排序
ListNode* insertionSortList(ListNode* head) {
if (head == nullptr) return nullptr;

ListNode* dummy = new ListNode(0); // 创建虚拟头节点
dummy->next = head;
ListNode* cur = head->next;
ListNode* lastSorted = head;

while (cur != nullptr) {
    if (lastSorted->val <= cur->val) {
        lastSorted = cur;
        cur = cur->next;
    } else {
        ListNode* prev = dummy;
        while (prev->next->val <= cur->val) {
            prev = prev->next;
        }
        lastSorted->next = cur->next;
        cur->next = prev->next;
        prev->next = cur;
        cur = lastSorted->next;
    }
}

return dummy->next;

}

// 创建链表(测试用)
ListNode* createList() {
int n, val;
cout << “请输入链表中元素的数量:”;
cin >> n;
cout << “请输入链表中的元素:”;
ListNode* head = nullptr;
ListNode* tail = nullptr;
for (int i = 0; i < n; ++i) {
cin >> val;
ListNode* newNode = new ListNode(val);
if (head == nullptr) {
head = newNode;
tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
return head;
}

// 主函数
int main() {
ListNode* head = createList();
cout << “原始链表:”;
printList(head);

head = insertionSortList(head);

cout << "排序后的链表:";
printList(head);

// 释放链表内存
while (head != nullptr) {
    ListNode* temp = head;
    head = head->next;
    delete temp;
}

return 0;

}


### 代码说明
1. **链表节点定义**:使用 `struct ListNode` 定义链表节点,包含一个整数值 `val` 和一个指向下一个节点的指针 `next`。
2. **打印链表函数**:`printList` 用于输出链表中的所有元素。
3. **插入排序算法**:`insertionSortList` 使用插入排序算法对链表进行升序排序。插入排序适合链表排序,因为它可以通过改变节点的指针直接在链表中移动元素,而不需要像数组那样移动大量元素。
4. **创建链表函数**:`createList` 用于从用户输入创建链表。
5. **主函数**:在 `main` 函数中,创建链表、打印原始链表、调用排序函数、打印排序后的链表,并释放链表内存。

### 测试运行
运行程序后,按照提示输入链表元素,程序会输出排序后的结果。例如:

请输入链表中元素的数量:5
请输入链表中的元素:3 1 4 2 5
原始链表:3 1 4 2 5
排序后的链表:1 2 3 4 5


### 注意事项
- 插入排序的时间复杂度为 O(n²),对于大规模数据可能效率较低。如果需要更高效率的排序算法,可以考虑归并排序,其时间复杂度为 O(n log n)。
- 在实际应用中,链表排序的选择需要根据具体场景和数据规模来决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Thomas

谢谢您的打赏,我将会更好创作。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值