链表的带参数排序,可以通过姓名、成绩进行升序或降序操作
来源:互联网 发布:php foreach 编辑:程序博客网 时间:2024/06/10 02:44
先上效果图:
void main(){ stu * pHeader = creatLink(4); //创建链表,需要手动输入姓名成绩 sort(pHeader, true, COMPARE_SCORE); //按照成绩升序排列 outLink(pHeader); //控制台上输出链表 clearLink(pHeader); //清空链表}
红框部分即为成绩升序排列
/* 链表排序,支持带参数的排序, 可以通过改变参数来实现根据成绩排序、根据姓名排序, 并且可以升序降序,如下: */#define COMPARE_SCORE 0 //比较成绩#define COMPARE_NAME 1 //比较姓名struct stu{ char name[24]; int score; stu * next;};//所用到的工具方法声明,具体实现见尾部int MyStrCmp(const char * str1, const char * str2); //比较字符串void swapEle(stu * p0, stu * p2); //交换链表元素int cmpEle(stu * s1, stu * s2, int nFlag); //比较链表元素// 创建链表,并将链表初始化,需要手动输入参数stu * creatLink(int nCount){ stu * pHeader = new stu; strcpy_s(pHeader->name, "start"); pHeader->next = NULL; stu * pTemp = pHeader; cout << "请按照如下格式输入学生信息: 姓名 (回车键) 成绩" << endl; for (int i = 0; i < nCount; i++) { pHeader->next = new stu; pHeader->next->next = NULL; pHeader = pHeader->next; cout << "请输入信息: "; cin >> pHeader->name; cin >> pHeader->score; } return pTemp;}/*链表升降序, bAscend为true时升序,为false时降序 nFlag用与传入需要比较的参数, 如COMPARE_SCORE, COMPARE_NAME*/void sort(stu * pHeader, bool bAscend, int nFlag){ int nJudge = bDescend ? 1 : -1; //nJudge用于决定升降序 if (NULL == pHeader || NULL == pHeader->next || NULL == pHeader->next->next) return; stu * pTemp = pHeader; stu * pEnd = NULL; stu * p0 = pHeader->next; stu * p1 = pHeader->next->next; while (pEnd != p1) { while (pEnd != p1) { if (nJudge == cmpEle(p0, p1, nFlag)) //敲黑板,划重点,此处使代码更加容易功能扩充和维护 swapEle(pHeader, p1); pHeader = pHeader->next; p0 = pHeader->next; p1 = p0->next; } pEnd = p0; pHeader = pTemp; p0 = pHeader->next; p1 = p0->next; }}// 将链表输出void outLink(stu * pHeader){ pHeader = pHeader->next; while (NULL != pHeader) { cout << pHeader->name << "\t" << pHeader->score << endl; pHeader = pHeader->next; }}// 清空链表void clearLink(stu * pHeader){ stu * pTemp = pHeader; while (NULL != pHeader) { pTemp = pHeader->next; delete pHeader; pHeader = pTemp; } delete pHeader;}/* 工具类方法的实现*/// 字符串比较int MyStrCmp(const char * str1, const char * str2){ while (*str1) { if (*str1 > *str2) { return 1; } if (*str1 == *str2) { if (*(str1 + 1) == NULL && *(str2 + 1) == NULL) return 0; if (*(str1 + 1) != NULL && *(str2 + 1) == NULL) return 1; ++str2; ++str1; continue; } if (*str1 < *str2) { return -1; } } return -1;}// 交换链表元素(注意传入链表节点不是连续的,中间有间隔)void swapEle(stu * p0, stu * p2){ stu * p3 = p2->next; stu * p1 = p0->next; p0->next = p2; p2->next = p1; p1->next = p3;}// 比较链表元素int cmpEle(stu * s1, stu * s2, int nFlag){ int nCtrl = 0; switch (nFlag) { case COMPARE_SCORE: nCtrl = s1->score > s2->score ? 1 : -1; break; case COMPARE_NAME: nCtrl = MyStrCmp(s1->name, s2->name); } return nCtrl;}
阅读全文
1 0
- 链表的带参数排序,可以通过姓名、成绩进行升序或降序操作
- 第十五周项目3-带成绩的姓名排序(按姓名升序排序)
- 第十五周项目3--带姓名的成绩排序(按成绩升序排列)
- 带姓名的成绩排序
- 任意类任意字段进行升序或降序排序
- 有5名学生保存在结构体数组中,编程按学生的成绩升序排序,按学生的姓名降序排序,按年龄从低到高排序
- 有5名学生保存在结构体数组中,编程按学生的成绩升序排序,按学生的姓名降序排序,按年龄从低到高排序
- 有5名学生保存在结构体数组中,编程按学生的成绩升序排序,按学生的姓名降序排序,按年龄从低到高排序
- 【GridView表头排序】点击表头可以进行升序和降序的排列
- 通过js去对表格的列,根据其内容进行排序(升序或者降序)
- 在block按学号的升序和降序排列;按姓名的升序和降序排序,按年龄的升序和降序排列
- 对数组里面的数据进行升序降序排序
- 有5名学生保存在结构体数组中,编程按学生的成绩升序排序,按学生的姓名降序排序,按年龄从低到高排序, 成绩, 年龄
- 对数组中的自定义的类型根据姓名,年龄排序(升序, 降序)sortedArrayUsingSelector
- 【华为 OJ 】输入整型数组及其排序标志,对输入的数进行升序或降序排列
- js:数组重排序问题:如何使用sort()方法按数值的大小进行升序或降序排列
- OC中按姓名,年龄,身高升序,降序排序
- TreeMap练习:对学生对象的姓名进行升序排序
- 巧妙设计一个mobile or pc 的登录界面
- 怎么将cocos2d-js 3.x 成功在android平台编译打包 (测试ok)
- LeetCode43_Multiply Strings
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛M题
- Linux系统该怎么学?运维老鸟的经验心得。
- 链表的带参数排序,可以通过姓名、成绩进行升序或降序操作
- 未排序正整数数组中累加和为给定值的最长子数组长度
- String 中的==
- 模拟登录正方教务管理系统-JAVA实现
- Hadoop MapReduce 简单案例--求素数个数
- vue 2 使用Bus.js进行兄弟(非父子)组件通信 简单案例
- PHP文件上传学习(多文件,ajax无刷新方式)
- 深度学习中Dropout和Layer Normalization技术的使用
- Android Streaming Live Camera Video to Web Page