带头结点的单向链表的排序

将带头结点的单向链表结点数据域中的数据从小到大排序即若圆链表节点数据域从头至尾的数据为10 4 2 8 6排序后,列表节点数据与从头至尾的数据为2 4 6 8 10。

img

img

img

img

img

img

供参考:

void sortList(NODE *h)
{
    /************Begin**********/
    NODE *ptr = NULL, *pt = NULL, *pend = NULL;
    while (h->next != pend)
    {
        ptr = h;
        pt = h->next;
        while (pt->next != pend)
        {
            if (pt->data > pt->next->data)
            {
                ptr->next = pt->next;
                pt->next = pt->next->next;
                ptr->next->next = pt;
                pt = ptr->next;
            }
            pt = pt->next;
            ptr = ptr->next;
        }
        pend = pt;
    }
    /************End**********/
}

另一种只交换数据域的写法,供参考:

void sortList(NODE* h)
{
    /**********Begin**********/
    int   t;
    NODE* ph = NULL, * pt = NULL;
    ph = h->next;
    while (ph) {
        pt = ph->next;
        while (pt) {
            if (ph->data > pt->data) {
                t = ph->data;
                ph->data = pt->data;
                pt->data = t;
            }
            pt = pt->next;
        }
        ph = ph->next;
    }
    /***********End***********/
}

这么长的代码应该复制到代码块里放出来,放个截图谁愿意照着打字吗?

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7459464
  • 这篇博客你也可以参考下:公民身份号码是一种由18位数字组成的特征组合码,其排列顺序从左至右依次为:6位数字地址码、8位数字出生日期码,3位数字顺序码和1位数字校验码(校验码若为10则用字符X来表示)。编写程序从键盘输入一个
  • 除此之外, 这篇博客: 【数据结构】简单选择排序以及时间复杂度的分析中的 时间复杂度分析:  部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 首先,简单选择排序是一个稳定的排序算法;它最大的特点就是交换移动数据次数相当少,这样也就节约了相应的时间。分析它的时间复杂度发现,无论最好最差的情况,其比较次数都是一样的多,第i趟排序需要进行n-i次关键字的比较,此时需要比较

    而对于交换次数而言,当最好的时候,交换为0次,最差的时候,也就初始化降序,需要交换n-1次,基于最终的排序时间是比较与交换的次数总和,因此,总的时间复杂度依然为O(n²)

     

  • 您还可以看一下 张旭老师的【造物者】手把手带你做快递管理系统课程中的 【造物者】第十五节·快递分页列表编写小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    解决方案

    我们可以使用冒泡排序算法对带头结点的单向链表进行排序。冒泡排序是一种简单直观的排序算法,其基本思想是通过相邻元素的比较和交换,将较大的元素逐渐“浮”到右侧。

    下面是一个示例的代码实现:

    void BubbleSort(LinkList L) {
        if (L == NULL || L->next == NULL) { // 空链表或只有一个节点无需排序
            return;
        }
    
        int len = 0;
        LinkList p = L->next;
        while (p != NULL) { // 计算链表长度
            len++;
            p = p->next;
        }
    
        for (int i = 0; i < len-1; i++) { // 遍历链表每次冒泡排序将最大值移到最后
            p = L->next;
            for (int j = 0; j < len-i-1; j++) {
                if (p->data > p->next->data) { // 如果当前节点大于下一个节点则交换节点数据
                    int temp = p->data;
                    p->data = p->next->data;
                    p->next->data = temp;
                }
                p = p->next;
            }
        }
    }
    

    具体实现步骤如下:

    1. 首先判断链表是否为空或只有一个节点,如果是,则无需排序,直接返回。
    2. 计算链表的长度,作为冒泡排序的循环次数。
    3. 使用两个指针p和q,p指向当前节点,q指向下一个节点,比较p和q的数据值,如果p的值大于q的值,则交换两个节点的数据。
    4. 循环遍历链表,每次冒泡排序将最大值移到链表末尾。
    5. 返回排序后的链表。

    请注意,上述代码是C语言的示例代码,您可以根据具体的编程语言进行修改和转换。

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633