今天偶尔看到了C结构体的单项链表。

于是重新温习了下双向链表,重写了下双向链表的简单排序实现,当做温习总结吧。

先定义双向链表

1 struct Student{
2     int studentId;
3     char * name;
4     Student *next, *last;
5 };

然后就是关键的排序方法:

int sortByName(Student *p){Student *head = p;//从链表头部开始排序(也可以去掉,去掉的话就是从传入的节点开始排序)while(head->last != NULL){head = head->last;}while(head != NULL){Student *headNext = head->next;while(headNext != NULL){if(strcmp(head->name, headNext->name) > 0){swapStudent(head, headNext);//注意这里一定要交换下,因为改了链表节点的位置Student *tmp = head;head = headNext;headNext = tmp;}headNext = headNext->next;}head = head->next;}return 1;
}

里面又涉及到一个swapStudent方法,这个方法实现交换两个节点的功能

代码如下:

void swapStudent(Student *s1, Student *s2){if(s1->next == s2){if(s2->next != NULL){s2->next->last = s1;}if(s1->last != NULL){s1->last->next = s2;}s1->next = s2->next;s2->last = s1->last;s1->last = s2;s2->next = s1;}else if(s1->last == s2){if(s1->next != NULL){s1->next->last = s2;}if(s2->last != NULL){s2->last->next = s1;}s2->next = s1->next;s1->last = s2->last;s2->last = s1;s1->next = s2;}else{//这里面一定要注意更新节点相邻节点里面的上下节点的值//我被坑在这,查了好久才查出来//上面两个循环体也一样需要注意if(s1->next != NULL){s1->next->last = s2;}if(s1->last != NULL){s1->last->next = s2;}if(s2->next != NULL){s2->next->last = s1;}if(s2->last != NULL){s2->last->next = s1;}Student *s1Next = s1->next;Student *s1last = s1->last;s1->next = s2->next;s1->last = s2->last;s2->next = s1Next;s2->last = s1last;}
}

上面就是简单排序实现的核心实现。

如果仔细看了的话,会注意一个问题。

如果使用冒泡排序,上面的swap方法可以实现的简单一点,因为只会交换相邻的两个节点。

我这样写就是要更一般化,对节点操作要求更高,利于自己理解。

转载于:https://www.cnblogs.com/bokezhilu/p/7620181.html

C 双向链表的简单排序实现相关推荐

  1. HDU1040简单排序题

    简单排序直接上代码:总共使用了九种方法解决这道题 方法一: #include<iostream> #include<algorithm> #include<cmath&g ...

  2. 算法:三种简单排序算法

    排序算法比較常见的有:冒泡排序.简单选择排序.直接插入排序:希尔排序.堆排序.归并排序和高速排序算法等. 今天先学习一下前面三种比較简单的算法.排序的相关概念: ①排序的稳定性:两个或多个元素相等.排 ...

  3. C#实现(递归和非递归)快速排序和简单排序

    C#实现(递归和非递归)快速排序和简单排序 本人因为最近工作用到了一些排序算法,就把几个简单的排序算法,想冒泡排序,选择排序,插入排序,奇偶排序和快速排序等整理了出来,代码用C#代码实现,并且通过了测 ...

  4. [MIPS汇编语言]简单排序实现

    排序是程序语言的基础操作 通过排序练习可以提高对语言的掌握程度 汇编是可以说是最底层的语言了,学习汇编,可以提高对几乎所有语言的理解程度.(个人看法) 下面展示了用MIPS汇编语言实现的简单排序 (对 ...

  5. 数据结构 排序【简单排序(冒泡、插入)、希尔排序、堆排序、排序方法的综合比较、2套 排序汇总代码】

    目   录 第9章 排序(上) 9.1 简单排序(冒泡.插入) 1.前提 2.简单排序(冒泡排序) 3.简单排序(插入排序) 4.时间复杂度下界 9.2 希尔排序 9.3 堆排序 排序方法综合比较 排 ...

  6. C++简单排序,堆排序

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105009824 简 ...

  7. iOS程序员也要学点算法吧 简单排序之插入排序

    进入到简单排序的第三个排序,插入排序.其实插入排序,和冒泡,还有选择排序都是比较排序算法的一种,比较效率基本也是O(N²) 但是插入排序,效率基本比冒泡快一倍,选择快一点. 有一个已经有序的数据序列, ...

  8. python sort 部分元素_Python 简单排序算法-选择、冒泡、插入排序实现

    写文章主要是记录自己每天学习的东西,本篇文章主要介绍数据结构中常用的简单的排序算法,虽然这些算法用Python实现起来不是十分的高效,不如c.java之类的运行速度快,应用Python实现主要是为了: ...

  9. 简单排序算法(Java实现)

    简单排序算法:冒泡排序,选择排序,插入排序 一.冒泡排序 1.1 原理: 从第一个数据开始,与第二个数据相比较,如果第二个数据小于第一个数据,则交换两个数据的位置 指针由第一个数据移向第二个数据,第二 ...

最新文章

  1. 《iPhone开发基础教程》第13章 我在哪里?使用Core Location定位功能
  2. grub resourceunknown filesystem异常处理
  3. pfile文件怎么恢复格式_回收站清空的文件怎么恢复?值得收藏的恢复方法
  4. 带有审图号的区位图制作
  5. dp---数字三角形问题
  6. Android WebView中那些不得不解决的坑~~
  7. arcmap拓扑错误检查器不亮_ARCGIS拓扑检查步骤与修正拓扑错误技巧
  8. matlab根号二,matlab根号二怎么打_常见问题解析,matlab,根号二,根号
  9. 计算机音乐按键有声音,计算器上的声音键是哪个键
  10. android 6.1 app闪退,手机软件闪退怎么办 具体解决方法【图文】
  11. CRM的“几宗秘辛”(上篇)
  12. 通过RSA和DES实现网络报文加密加签(实例)
  13. mx250是什么_分析mx250显卡什么级别
  14. PHP:时间戳time和日期格式字符串转换date
  15. Hadoop3.2.0 YARN 容量调度程序
  16. winds操作系统下登录本地MySQL和远程MySQL
  17. Android 基于Socket的聊天室
  18. PHP中的addslashes双胞胎兄弟函数
  19. 0X000000该内存不能为read written的解决思路(艾孜尔江撰稿)
  20. 【MySQL进阶】MySQL事务隔离与锁机制底层原理万字总结(建议收藏!!)

热门文章

  1. MOSS 2007的备份与恢复
  2. 语音交互编程语言了解一下?
  3. Cannot resolve method addSource
  4. BootStrap轮播图失效
  5. trust cv的含义
  6. 深度学习:用于multinoulli输出分布的softmax单元
  7. html5背景图片上放按钮,html5自定义video标签的海报与播放按钮
  8. CentOs 中显示乱码问题
  9. MySQL专题—— 从认识索引到理解索引【索引优化】
  10. 测试过程中常用的linux命令之【查找指定的文件内容】