C 双向链表的简单排序实现
今天偶尔看到了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 双向链表的简单排序实现相关推荐
- HDU1040简单排序题
简单排序直接上代码:总共使用了九种方法解决这道题 方法一: #include<iostream> #include<algorithm> #include<cmath&g ...
- 算法:三种简单排序算法
排序算法比較常见的有:冒泡排序.简单选择排序.直接插入排序:希尔排序.堆排序.归并排序和高速排序算法等. 今天先学习一下前面三种比較简单的算法.排序的相关概念: ①排序的稳定性:两个或多个元素相等.排 ...
- C#实现(递归和非递归)快速排序和简单排序
C#实现(递归和非递归)快速排序和简单排序 本人因为最近工作用到了一些排序算法,就把几个简单的排序算法,想冒泡排序,选择排序,插入排序,奇偶排序和快速排序等整理了出来,代码用C#代码实现,并且通过了测 ...
- [MIPS汇编语言]简单排序实现
排序是程序语言的基础操作 通过排序练习可以提高对语言的掌握程度 汇编是可以说是最底层的语言了,学习汇编,可以提高对几乎所有语言的理解程度.(个人看法) 下面展示了用MIPS汇编语言实现的简单排序 (对 ...
- 数据结构 排序【简单排序(冒泡、插入)、希尔排序、堆排序、排序方法的综合比较、2套 排序汇总代码】
目 录 第9章 排序(上) 9.1 简单排序(冒泡.插入) 1.前提 2.简单排序(冒泡排序) 3.简单排序(插入排序) 4.时间复杂度下界 9.2 希尔排序 9.3 堆排序 排序方法综合比较 排 ...
- C++简单排序,堆排序
该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105009824 简 ...
- iOS程序员也要学点算法吧 简单排序之插入排序
进入到简单排序的第三个排序,插入排序.其实插入排序,和冒泡,还有选择排序都是比较排序算法的一种,比较效率基本也是O(N²) 但是插入排序,效率基本比冒泡快一倍,选择快一点. 有一个已经有序的数据序列, ...
- python sort 部分元素_Python 简单排序算法-选择、冒泡、插入排序实现
写文章主要是记录自己每天学习的东西,本篇文章主要介绍数据结构中常用的简单的排序算法,虽然这些算法用Python实现起来不是十分的高效,不如c.java之类的运行速度快,应用Python实现主要是为了: ...
- 简单排序算法(Java实现)
简单排序算法:冒泡排序,选择排序,插入排序 一.冒泡排序 1.1 原理: 从第一个数据开始,与第二个数据相比较,如果第二个数据小于第一个数据,则交换两个数据的位置 指针由第一个数据移向第二个数据,第二 ...
最新文章
- 《iPhone开发基础教程》第13章 我在哪里?使用Core Location定位功能
- grub resourceunknown filesystem异常处理
- pfile文件怎么恢复格式_回收站清空的文件怎么恢复?值得收藏的恢复方法
- 带有审图号的区位图制作
- dp---数字三角形问题
- Android WebView中那些不得不解决的坑~~
- arcmap拓扑错误检查器不亮_ARCGIS拓扑检查步骤与修正拓扑错误技巧
- matlab根号二,matlab根号二怎么打_常见问题解析,matlab,根号二,根号
- 计算机音乐按键有声音,计算器上的声音键是哪个键
- android 6.1 app闪退,手机软件闪退怎么办 具体解决方法【图文】
- CRM的“几宗秘辛”(上篇)
- 通过RSA和DES实现网络报文加密加签(实例)
- mx250是什么_分析mx250显卡什么级别
- PHP:时间戳time和日期格式字符串转换date
- Hadoop3.2.0 YARN 容量调度程序
- winds操作系统下登录本地MySQL和远程MySQL
- Android 基于Socket的聊天室
- PHP中的addslashes双胞胎兄弟函数
- 0X000000该内存不能为read written的解决思路(艾孜尔江撰稿)
- 【MySQL进阶】MySQL事务隔离与锁机制底层原理万字总结(建议收藏!!)