【C语言】单链表的排序

本文探讨如何使用C语言对单链表进行排序,涵盖了常见的冒泡排序和选择排序方法。通过实例代码详细解析了两种排序算法在链表操作中的应用,帮助读者理解链表排序的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void BubleSort(Plinklist *pplist)
{
           assert(pplist );
           Node *end= NULL ;
           Node *begin = *pplist ;
           while ((*pplist )->next != end)
          {
                    while (begin->next!=end)
                   {
                              if (begin->data < begin->next->data)
                             {
                                       int tmp = begin->data;
                                      begin->data = begin->next->data;
                                      begin->next->data = tmp;
                             }
                             begin = begin->next;
                   }
                   end = begin;
                   begin = * pplist;
          }
}
### 单链表排序的 C 语言实现 在 C 语言中,对单链表进行排序通常采用插入排序、归并排序或快速排序等方法。其中插入排序是一种较为直观的方法,适用于数据量较小的情况。 #### 插入法排序实现 插入法的基本思想是构建一个新的有序链表,并将原链表中的每个节点按照顺序插入到新链表中合适的位置。这种方法不需要额外的空间开销(除了临时变量),并且逻辑清晰[^2]。 ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* next; } List; // 创建新节点 List* createNode(int data) { List* node = (List*)malloc(sizeof(List)); node->data = data; node->next = NULL; return node; } // 将当前节点 p 插入到有序链表 new 中 void rank(List* p, List** new) { List* pNew = *new; List* pAnd = NULL; while (pNew) { if (pNew->data > p->data) { if (pNew == *new) { // 插入到头部 p->next = *new; *new = p; } else { // 插入到中间或尾部 pAnd->next = p; p->next = pNew; } return; } pAnd = pNew; pNew = pNew->next; } // 插入到最后 if (*new == NULL) *new = p; else pAnd->next = p; } // 对链表进行排序 void sortList(List** head) { if (*head == NULL) return; List* sorted = NULL; List* current = *head; List* next; while (current != NULL) { next = current->next; rank(current, &sorted); current = next; } *head = sorted; } ``` #### 示例主函数 以下是一个简单的主函数示例,用于演示如何使用上述排序函数: ```c int main() { List* head = createNode(5); head->next = createNode(2); head->next->next = createNode(7); head->next->next->next = createNode(1); head->next->next->next->next = createNode(3); printf("原始链表:\n"); List* temp = head; while (temp != NULL) { printf("%d ", temp->data); temp = temp->next; } sortList(&head); printf("\n排序后链表:\n"); temp = head; while (temp != NULL) { printf("%d ", temp->data); temp = temp->next; } return 0; } ``` ### 算法分析 - **时间复杂度**:插入排序的时间复杂度为 O(n²),其中 `n` 是链表的长度。对于小规模的数据集效率较高。 - **空间复杂度**:O(1),仅使用了常数级别的额外空间。 该算法适合于内存受限或者数据量不大的场景,若需要处理大规模数据集,则建议使用归并排序等更高效的排序方法[^2]。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值