C语言实现链表之单向链表(十四)链表打印和排序
2015-11-08 21:42
323 查看
C语言实现链表之单向链表(十四)链表打印和排序
上一篇文章给出了获取数据对应的结点的函数,本篇文章将给出链表打印和排序的函数,关键在于排序。/*============================================================================== * 操作 :打印链表中的所有结点的数据元素 * 操作前:pHeadNode为链表的头指针 * 操作后:打印出所有数据元素 ==============================================================================*/ void PrintfListDataNode(MyListNode* pHeadNode) { int icount = 0; while(pHeadNode != NULL) { icount++; printf("The node %d's name is %s, age is %d.\n", icount, pHeadNode->sNodeData.cName, pHeadNode->sNodeData.iAge); pHeadNode = pHeadNode->pNextNodeAddr; } printf("\n"); } /*============================================================================== * 操作 :对链表中的数据进行排序,2015年9月17日添加,采用冒泡排序法 * 操作前:pHeadNode为链表的头指针 * 操作后:返回排序后的头指针 ==============================================================================*/ MyListNode* SortList(MyListNode* pHeadNode) { MyListNode* ptemp1 = NULL; MyListNode* ptemp2 = NULL; MyListNode* ptemp3 = NULL; for (ptemp1 = pHeadNode; ptemp1->pNextNodeAddr != NULL; ptemp1 = ptemp1->pNextNodeAddr) { MyListNode* pEnd = ptemp3; ptemp2 = pHeadNode; ptemp3 = ptemp2->pNextNodeAddr; for (; ptemp3 != pEnd; ptemp2 = ptemp2->pNextNodeAddr, ptemp3 = ptemp3->pNextNodeAddr) { if (ptemp2->sNodeData.iAge > ptemp3->sNodeData.iAge) { int temp = ptemp2->sNodeData.iAge; ptemp2->sNodeData.iAge = ptemp3->sNodeData.iAge; ptemp3->sNodeData.iAge = temp; char ctemp[20]; strcpy(ctemp, ptemp2->sNodeData.cName); strcpy(ptemp2->sNodeData.cName, ptemp3->sNodeData.cName); strcpy(ptemp3->sNodeData.cName, ctemp); } } } return pHeadNode; }
打印链表大家很清楚地可以明白,主要是对链表排序这个函数可能比较难理解,下面说一下其思想。
该链表的排序算法采用了冒泡排序法的思想,它使用了两个指针,分别存储相邻的结点,类似于冒泡排序中的相邻数据,然后使用冒泡的思想进行循环即可,注意,这里的排序只改变了结点中的数据,而没有改变结点的顺序,即每个结点指针域的值还是不变的,我们只是对链表中的数据进行了排序。
这个函数可能比较难理解,大家可以仔细思考一下,只要理解了冒泡排序的思想,再类比一下就比较好理解,不过这种排序算法并不是最好的,在《程序员面试宝典》中给出了其他的排序算法,那里采用了标准的冒泡排序法的步骤,即通常见到的i、j控制双层循环体,然后进行比较排序,不过那里需要知道链表的长度,用来控制何时终止循环,感兴趣的读者可以自己动手先写一下试试,然后比较一下,发现各有所长,我这个程序可能相对于复杂一些,但是这是标准的链表操作,不够我建议大家可以掌握那种基本的方法,容易理解。
相关文章推荐
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言
- C语言实现BMP转换JPG的方法
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- C语言查找数组里数字重复次数的方法
- C语言泛型编程实例教程
- C语言中使用lex统计文本文件字符数
- 在C语言中转换时间的基本方法介绍
- C语言进制转换代码分享