链表排序——选择排序法(纯C语言版)

2023-11-11

链表选择排序

/********************************* 链表的排序  *******************************************/  
/* 
========================== 
 功能:选择排序(由小到大) 
 返回:指向链表表头的指针 
========================== 

 选择排序的基本思想就是反复从还未排好序的那些节点中, 
 选出键值(就是用它排序的字段,我们取学号num为键值)最小的节点, 
 依次重新组合成一个链表。 

 我认为写链表这类程序,关键是理解: 
 head存储的是第一个节点的地址,head->next存储的是第二个节点的地址; 
 任 意一个节点p的地址,只能通过它前一个节点的next来求得。 

单向链表的选择排序图示: 
---->[1]---->[3]---->[2]...----> [n]---->[NULL](原链表) 
head   1->next  3->next  2->next   n->next 

---->[NULL](空链表) 
first 
tail 
---->[1]---->[2]---->[3]...---->[n]---->[NULL](排序后链表) 
first   1->next  2->next  3->next   tail->next 

1、先在原链表中找最小的,找到一个后就把它放到另一个空的链表中; 
2、空链表中安放第一个进来的节点,产生一个有序链表,并且让它在原链表中分离出来(此时要注意原链表中出来的是第一个节点还是中间其它节点); 
3、继续在原链表中找下一个最小的,找到后把它放入有序链表的尾指针的next,然后它变成其尾指针; 
*/  
struct student *SelectSort(struct student *head)  
{  
    struct student *pfirst;      /* 排列后有序链的表头指针 */  
    struct student *ptail;       /* 排列后有序链的表尾指针 */  
    struct student *pminBefore;  /* 保留键值更小的节点的前驱节点的指针 */  
    struct student *pmin;        /* 存储最小节点   */  
    struct student *p;           /* 当前比较的节点 */  

    pfirst = NULL;  
    while (head != NULL)         /*在链表中找键值最小的节点。*/  
    {  
    /* 注意:这里for语句就是体现选择排序思想的地方 */  
        for (p = head, pmin = head; p->next != NULL; p = p->next) /*循环遍历链表中的节点,找出此时最小的节点。*/  
        {  
            if (p->next->num < pmin->num) /*找到一个比当前min小的节点。*/  
            {  
                pminBefore = p;           /*保存找到节点的前驱节点:显然p->next的前驱节点是p。*/  
                pmin       = p->next;     /*保存键值更小的节点。*/  
            }  
        }  

    /*上面for语句结束后,就要做两件事;一是把它放入有序链表中;二是根据相应的条件判断,安排它离开原来的链表。*/  

        /*第一件事*/  
        if (pfirst == NULL)     /* 如果有序链表目前还是一个空链表                      */  
        {  
            pfirst = pmin;      /* 第一次找到键值最小的节点。                          */  
            ptail  = pmin;      /* 注意:尾指针让它指向最后的一个节点。                */  
        }  
        else                    /* 有序链表中已经有节点                                */  
        {  
            ptail->next = pmin; /* 把刚找到的最小节点放到最后,即让尾指针的next指向它。*/  
            ptail = pmin;       /* 尾指针也要指向它。                                  */  
        }  

        /*第二件事*/  
        if (pmin == head)        /* 如果找到的最小节点就是第一个节点                    */  
        {  
            head = head->next;   /* 显然让head指向原head->next,即第二个节点,就OK       */  
        }  
        else /*如果不是第一个节点*/  
        {  
            pminBefore->next = pmin->next; /*前次最小节点的next指向当前pmin的next,这样就让pmin离开了原链表。*/  
        }  
    }  

    if (pfirst != NULL)     /*循环结束得到有序链表first                */  
    {  
        ptail->next = NULL; /*单向链表的最后一个节点的next应该指向NULL */   
    }  
    head = pfirst;  
    return head;  
}  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链表排序——选择排序法(纯C语言版) 的相关文章

  • GET和POST之间的主要区别

    1 GET是从服务器上获取数据 POST是向服务器传送数据 2 在客户端 GET方式在通过URL提交数据 数据在URL中可以看到 POST方式 数据放置在HTML HEADER内提交 3 对于GET方式 服务器端用Request Query
  • 认识动态规划

    你的打赏是我奋笔疾书的动力 概念篇 线性规划 下图给出了模型 其中目标函数和约束条件里面的不等式函数都是关于xi的线性函数 这类问题都有一些不错的求解方式 整数规划 若在线性模型中 变量限制为整数 则称为整数线性规划 即为整数规划 可见整数
  • 低代码——前端进阶的必修课

    近年来 随着技术的不断发展 前端开发工作变得越来越重要 作为初中级前端工程师 我们始终在追求进步 不断探索新技术 新思路 以提升自己的竞争力 而如今 学习低代码技术已刻不容缓 在这篇文章中 我将为大家介绍前端进阶的高级指南 重点探讨低代码技
  • JS-----数据结构与算法(2)

    目录 三 栈结构 1 认识栈结构 2 封装栈结构 3 应用 3 1 十进制转二进制 3 2 进制转换法 四 队列 1 队列是什么 2 队列的封装 3 队列的应用 击鼓传花 4 双端队列 5 判断是否为回文 三 栈结构 1 认识栈结构 栈 s
  • hdu 2024C语言合法标识符

    链接http acm hdu edu cn showproblem php pid 2024 思路 根据定义写 1 所有标识符必须由一个字母 a z或A Z 或下划线 开头 2 标识符的其它部分可以用字母 下划线或数字 0 9 组成 3 大
  • python中format的用法-python基础_格式化输出(%用法和format用法)

    目录 用法 1 整数的输出 o oct 八进制 d dec 十进制 x hex 十六进制 1 gt gt gt print o 20 2 24 3 gt gt gt print d 20 4 20 5 gt gt gt print x 20
  • 体积着色器(Volume Shader)

    控制体积材质 如灯光雾 的颜色 透明度和蒙版不透明度 通过该着色器 可以直接将其他属性和效果与材质的颜色 透明度和蒙版不透明度相连 体积着色器 Volume Shader 可用于 聚光灯 Spot Light 点光源 Point Light
  • 月份表示用指针数组保存表示每个月份的英文单词以及“Illegal month”的首地址,然后编程实现:从键盘任意输入一个数字表示月份值n,程序输出该月份的英文表示,若n不在1~12之间,则输出“Il

    提示 各个月份的写法分别是 January February March April May June July August September October November December 程序的运行结果示例1 Input mon
  • WDK学习笔记_区块链项目实现_MAE

    文章目录 摘要 项目 区块链凤鸡溯源项目的实现 实现总流程 1 1 编写区块链网络配置文件 1 1 1 证书配置文件 crypto config 总体逻辑 详情 代码 1 1 2 创世区块及通道配置文件 总体逻辑 详情 代码 1 1 3 启
  • Chrome浏览器修改页面背景色

    转自 http jingyan baidu com article 5552ef47315ef9518ffbc9e7 html 有时候我们用浏览器看网页的内容时 如果长时间盯着白底黑字的屏幕 眼睛会很累 希望把网页页面的默认颜色改为淡绿色
  • 二叉树概念

    1 掌握树的基本概念 树 是一类重要的非线性数据结构 是以分支关系定义的层次结构 每个结点有零个或多个子结点 没有父结点的结点称为根结点 每一个非根结点有且只有一个父结点 除了根结点外 每个子结点可以分为多个不相交的子树 2 掌握树的相关概
  • Nginx安装和反向代理配置

    什么是反向代理 反向代理是指以代理服务器来接受internet上的连接请求 然后将请求转发给内部网络上的服务器 并将从服务器上得到的结果返回给internet上请求连接的客户端 此时代理服务器对外就表现为一个反向代理服务器 反向代理代理的是
  • 查看相关性

    查看相关性 方法一 df to csv data1 csv import matplotlib pyplot as plt import seaborn as sns 变量相关性分析 fig ax plt subplots fig set
  • 逻辑回归案例练习

    逻辑回归 场景一 在训练的初始阶段 我们将要构建一个逻辑回归模型来预测 某个学生是否被大学录取 设想你是大学相关部分的管理者 想通过查看申请学生的两次测试的评分 来决定他们是否被录取 现在你拥有之前申请学生的可以用于训练逻辑回归的训练样本集
  • 钉钉微应用接入(企业内部开发)

    文档中心 https open doc dingtalk com 钉钉后台配置 创建微应用流程 获取企业号CorpID Secret 登录钉钉OA管理后台 微应用 工作台设置 仅企业主管理员可查看 应用开发流程 注册企业 进入OA管理后台
  • 原来gdb的底层调试原理这么简单

    一 前言 这篇文章来聊聊大名鼎鼎的GDB 它的豪门背景咱就不提了 和它的兄弟GCC一样是含着金钥匙出生的 在GNU的家族中的地位不可撼动 相信每位嵌入式开发工程师都使用过gdb来调试程序 如果你说没有用过 那只能说明你的开发经历还不够坎坷
  • 【04】Unity AR 2022Vuforia——虚拟按钮超详细教程【含代码】

    04 Unity AR 2022Vuforia 虚拟按钮超详细教程 含代码 虚拟按钮超详细教程 含代码 目录 04 Unity AR 2022Vuforia 虚拟按钮超详细教程 含代码 1 前期工作 2 创建Virtual Button 3
  • Vue3-初识Vue3、创建Vue3工程、vue3组合式API(setup、ref函数、reactive函数)、响应式原理、计算属性、监视属性

    Vue3 1 目录 Vue3 1 一 Vue3简介 二 创建Vue3 0工程 1 使用vue cli创建 2 使用vite创建 三 常用的Composition API 组合式API 1 拉开序幕的setup 2 ref函数 3 react
  • Flutter沉浸式透明状态栏-flutter自定义凸起BottomAppBar导航

    注意 flutter项目默认是使用Kotlin语言 在Google I O 2017中 Google 宣布 Kotlin 取代 Java 成为 Android 官方开发语言 Kotlin详情见 https www kotlincn net

随机推荐

  • 异常处理--java.lang.reflect.MalformedParameterizedTypeException

    异常信息 org springframework beans factory BeanCreationException Error creating bean with name sqlSessionFactory defined in
  • C语言指针详解

    1 指针是什么 指针是内存中一个最小单元的编号 也就是地址 平时口语中说的指针 通常指的是指针变量 是用来存放内存地址的变量 所以 指针就是地址 口语中说的指针通常指的是指针变量 1 指针变量 我们可以通过 取地址操作符 取出变量的内存其实
  • 活动效果评估体系,该怎么搭建?

    如果让你来评估这次活动 你会怎么分析 无论是面试还是工作 做数据分写的同学都经常遇到这个问题 今天我们系统讲解一下 场景还原 某音乐类APP 对新用户进行一个新注册即送7天会员权益的活动 用户注册后 自主决定是否点击领取 为期1个月 问 如
  • python函数定义参数类型和返回值类型

    python中我们也可以定义函数的参数类型和返回值类型 如下代码 函数参数和返回值的类型声明 python函数类型的声明 更加有意义 更加实用一些 def add a b param a int param b int return int
  • C++ STL中map.erase(it++)用法原理解析

    之前在代码中使用map erase函数时 误搬了vector erase的用法 导致Server down掉了 好在在测试环境就及时发现了问题 在上线前进行了补救 以下总结一下map erase的正确用法 首先看一下在循环中使用vector
  • 灰灰-325-326-327-2019中南大学计算机上机-走台阶(3)

    1 n个台阶 一次走1阶或2阶 问走n阶有多少可能 1 lt n lt 1000 000 结果用1000 0000 7取模输出 输入格式 输入台阶数n 输出格式 结果用1000 0000 7取模输出 输入样例 3 输出样例 3 includ
  • 【技巧】各编辑器基础开发快捷键

    文章目录 一 IDEA 二 vim 1 各个模式的相互切换 2 正常模式 3 插入模式 4 底行模式 5 视图模式 三 Visual Studio 2017 四 PyCharm 一 IDEA psvm 回车 快速打出main函数 sout
  • docker网络自定义

    docker网络自定义 书接上回 我们认识了docker0网络以及 link参数的使用 https blog csdn net hello list article details 124815842 今天来了解下docker自定义网络 那
  • Java描述贪心算法解决背包问题

    思路 首先将物品根据性价比排好序在一个集合里 性价比 价格 重量 然后根据性价比从大到小依次依次放入背包 如果没办法放入这个物品的全部 就放入一部分 如果可以放入全量物品 就放入全量物品 Main java的代码 import java u
  • get和post区别

    get参数通过url传递 post放在post是放在请求头的包体 request body 中 因为参数直接暴露在url中 get比post更不安全 所以不能用来传递敏感信息 get请求在url中传递的参数是有长度限制的 get提交的数据最
  • 『动态规划·差分』队列

    P r o b l e m mathrm Problem Problem S o l u t i o n mathrm Solution Solution 首先考虑第一小问 问题转化为 每一行的问题互相独立 令 c j a i j a 1
  • Java之经典排序算法(一)

    一 冒泡排序 不稳定的排序算法 快希选堆 1 算法思路 比较相邻元素 如果第一个比第二个大 则交换这两个元素 从第一个元素开始依次往后比较相邻两个元素 直到最后一个比较完 这样最后一个元素就是最大的元素 再次从第一个元素开始依次往后比较相邻
  • 锁,避免虚假唤醒,注意死锁

    unique lock
  • 记录kitti数据集的坐标系转换问题

    Calib文件说明 以00000 txt文件为例 详细介绍每行含义 P0 7 070493000000e 02 0 000000000000e 00 6 040814000000e 02 0 000000000000e 00 0 00000
  • DC-DC电源模块输出先放大电容还是小电容

    最好的资料是电容厂家的设计指南 1 电容简单的等效模型是C ESL ESR 2 通常电解电容容量越大 ESR越小 ESL越大 承受纹波电流越大 3 电流流经阻抗最小路径 4 大电流 PCB走线电阻不能忽略 高频纹波电流PCB走线电感不能忽略
  • C语言之结构体内存的计算

    结构体的内存 一 提出疑问 结构体占用的是一片连续的内存空间 大小是由成员变量的类型决定的 但并不是计算所有成员变量的类型大小之和那么简单 先举一个实例 struct student int age 4个字节 int telephone 4
  • win系统使用frp端口映射实现内网穿透,配置“任务计划程序”提高稳定性

    Github下载最新版frp https github com fatedier frp releases download v0 48 0 frp 0 48 0 windows amd64 zip 解压把frpc exe和frpc ini
  • 【2】Python爬虫:分析AJAX传递的JSON获取数据-初步分析动态网页(1)

    前言 这是本人写的第二篇文章 希望能够帮助到一些和我一样的python爬虫初学者 在第一篇文章中 我总结了最近学到的利用requests和bs4第三方库共同作用 基本可以应对python获取静态网页数据的相关问题 但是如果现实中的网页往往比
  • JVM 四. 对象布局

    目录 一 对象实例化相关 创建对象的步骤 二 对象的内存布局 三 对象的访问定位 一 对象实例化相关 有哪些方式可以创建一个对象 new 方式创建一个对象 由new方式创建对象又延伸出 Builder建造者方式 Factory工厂方 等静态
  • 链表排序——选择排序法(纯C语言版)

    链表选择排序 链表的排序 功能 选择排序 由小到大 返回 指向链表表头的指针 选择排序的基本思想就是反复从还未排好序的那些节点中 选出键值 就是用它排序的字段 我们取学号num为键值 最小的节点 依次重新组合成一个链表 我认为写链表这类程序