C语言版--单链表排序,冒泡排序,选择排序,插入排序,快速排序,应有尽有,保证看懂,没有bug!交换节点版本!

本文详细介绍了单链表的四种排序方法:选择排序、冒泡排序、插入排序和快速排序。每种方法均附带代码实现及分析,帮助读者深入理解单链表排序的原理与技巧。

一.废话不多说,直接上代码。如果想看双向循环链表的朋友,可以在我的博客里找。

你好

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
    int data;
    struct node *next;
}node;

//生成一个节点
node *initList(void)
{
    node *new = malloc(sizeof(node));

    if(!new)
    {
        printf("malloc fail!\n");
        return NULL;
    }

    new->data = 0;
    new->next = NULL;

    return new;
}

//头插法
void head_insert(node *head, node *new)
{
    new->next = head->next;
    head->next = new;
}

//遍历
node *traverse(node *head)
{
    for(node *p = head->next; p; p = p->next)
    {
        printf("%d ", p->data);
    }

    printf("\n");
}


//冒泡排序,最优版本
void bubble_sort(node *head)
{
    int flag;
    node  *p, *prev, *tail;

    tail = NULL;   //tail以及tail后面的是排好序的元素,第一次还没有排好,所以为NULL
    
    while(1)
    {
        flag = 1;   //flag用来标志是否已经排好序

        //每次从head->next开始遍历,直到tail结束, prev是p的前驱节点
        for(prev = head, p = head->next; p && p->next != tail; prev = prev->next)
        {
            //交换后,p已经移动到后面,不需要再遍历下一个
            if(p->data > p->next->data)
            {
                flag = 0;      //修改flag=0,标志本轮循环交换过
                prev->next = p->next;    //弹出p节点
                p->next = p->next->next; //插入p节点
                prev->next->next = p;    //原来的p->next已经修改,需要用prev->next代替
            }
            else //没有交换就继续遍历下一个
            {
                p = p->next;
            }
        }
        
        printf("本轮排序移动出的最大值:%d\n", p->data);
        traverse(head);   ////显示每一轮排序结果

        if(flag)   //如果内层循环中都没有交换过,则所有节点都已经是排好序的
        {
            printf("冒泡排序结束!\n");
            break;
        }

        tail = p;  //tail向前移一个,tail以及tail后面的是排好序的元素
    }
}

//选择排序,初级版本
void choose_sort1(node *head)
{
    node *p, *q, *max, *prior;
    
    p = malloc(sizeof(node));  //生成一个p节点
    p->next = head->next;      //p取代head
    head->next = NULL;         //head是空链表
    
    while(p->next)
    {
        prior = p;
        max = prior->next;

        
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值