版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流C语言链表排序.精品文档.=功能:选择排序(由小到大)返回:指向链表表头的指针=*/*选择排序的基本思想就是反复从还未排好序的那些节点中,选出键值(就是用它排序的字段,我们取学号num为键值)最小的节点,依次重新组合成一个链表。我认为写链表这类程序,关键是理解:head存储的是第一个节点的地址,head->next存储的是第二个节点的地址;任意一个节点p的地址,只能通过它前一个节点的next来求得。单向链表的选择排序图示:->1->3->2.->n->NULL(原链表)head 1-
2、>next 3->next 2->next n->next->NULL(空链表)firsttail->1->2->3.->n->NULL(排序后链表)first 1->next 2->next 3->next tail->next图10:有N个节点的链表选择排序1、先在原链表中找最小的,找到一个后就把它放到另一个空的链表中;2、空链表中安放第一个进来的节点,产生一个有序链表,并且让它在原链表中分离出来(此时要注意原链表中出来的是第一个节点还
3、是中间其它节点);3、继续在原链表中找下一个最小的,找到后把它放入有序链表的尾指针的next,然后它变成其尾指针;*/struct student *SelectSort(struct student *head)struct student *first; /*排列后有序链的表头指针*/struct student *tail; /*排列后有序链的表尾指针*/ struct student *p_min; /*保留键值更小的节点的前驱节点的指针*/struct student *min; /*存储最小节点*/ struct student *p; /*当前比较的节点*/f
4、irst = NULL;while (head != NULL) /*在链表中找键值最小的节点。*/*注意:这里for语句就是体现选择排序思想的地方*/for (p=head,min=head; p->next!=NULL; p=p->next) /*循环遍历链表中的节点,找出此时最小的节点。*/ if (p->next->num < min->num) /*找到一个比当前min小的节点。*/ p_min = p; /*保存找到节点的前驱
5、节点:显然p->next的前驱节点是p。*/ min = p->next; /*保存键值更小的节点。*/ /*上面for语句结束后,就要做两件事;一是把它放入有序链表中;二是根据相应的条件判断,安排它离开原来的链表。*/*第一件事*/if (first = NULL) /*如果有序链表目前还是一个空链表*/ first = min; /*第一次找到键值最小的节点。*/ tail = min; /*注意:尾指针让它指向最后的一个节点。*/else /*有序链表中已经
6、有节点*/ tail->next = min; /*把刚找到的最小节点放到最后,即让尾指针的next指向它。*/ tail = min; /*尾指针也要指向它。*/*第二件事*/if (min = head) /*如果找到的最小节点就是第一个节点*/ head = head->next; /*显然让head指向原head->next,即第二个节点,就OK*/else /*如果不是第一个节点*/ p_min->next = min->next; /*前次最小节点的next
7、指向当前min的next,这样就让min离开了原链表。*/ if (first != NULL) /*循环结束得到有序链表first*/tail->next = NULL; /*单向链表的最后一个节点的next应该指向NULL*/ head = first;return head;/*=功能:直接插入排序(由小到大)返回:指向链表表头的指针=*/*直接插入排序的基本思想就是假设链表的前面n-1个节点是已经按键值(就是用它排序的字段,我们取学号num为键值)排好序的,对于节点n在这个序列中找插入位置,使得n插入后新序列仍然有序。按照这种思想,依次对链表从头到尾执行一遍,
8、就可以使无序链表变为有序链表。 单向链表的直接插入排序图示:->1->3->2.->n->NULL(原链表)head 1->next 3->next 2->next n->next->1->NULL(从原链表中取第1个节点作为只有一个节点的有序链表)head图11->3->2.->n->NULL(原链表剩下用于直接插入排序的节点)first 3->next 2->next n->ne
9、xt图12->1->2->3.->n->NULL(排序后链表)head 1->next 2->next 3->next n->next图13:有N个节点的链表直接插入排序1、先在原链表中以第一个节点为一个有序链表,其余节点为待定节点。2、从图12链表中取节点,到图11链表中定位插入。3、上面图示虽说画了两条链表,其实只有一条链表。在排序中,实质只增加了一个用于指向剩下需要排序节点的头指针first罢了。 这一点请读者务必搞清楚,要不然就可能认为它和上面的选择排序法一样了
10、。*/struct student *InsertSort(struct student *head)struct student *first; /*为原链表剩下用于直接插入排序的节点头指针*/struct student *t; /*临时指针变量:插入节点*/struct student *p; /*临时指针变量*/struct student *q; /*临时指针变量*/first = head->next; /*原链表剩下用于直接插入排序的节点链表:可根据图12来理解。*/head->next = NULL; /*只含有一个节点的链表的有序链表:可根据图11来理解。*/wh
11、ile (first != NULL) /*遍历剩下无序的链表*/*注意:这里for语句就是体现直接插入排序思想的地方*/for (t=first, q=head; (q!=NULL) && (q->num < t->num); p=q, q=q->next); /*无序节点在有序链表中找插入的位置*/*退出for循环,就是找到了插入的位置*/*注意:按道理来说,这句话可以放到下面注释了的那个位置也应该对的,但是就是不能。原因:你若理解了上面的第3条,就知道了。*/first = first->next; /*无序链表中的节点离开,以便它插入到有序
12、链表中。*/ if (q = head) /*插在第一个节点之前*/ head = t; else /*p是q的前驱*/ p->next = t; t->next = q; /*完成插入动作*/*first = first->next;*/return head;/*=功能:冒泡排序(由小到大)返回:指向链表表头的指针=*/*直接插入排序的基本思想就是对当前还未排好序的范围内的全部节点,自上而下对相邻的两个节点依次进行比较和调整,让键值(就
13、是用它排序的字段,我们取学号num为键值)较大的节点往下沉,键值较小的往上冒。即:每当两相邻的节点比较后发现它们的排序与排序要求相反时,就将它们互换。单向链表的冒泡排序图示:->1->3->2.->n->NULL(原链表)head 1->next 3->next 2->next n->next->1->2->3.->n->NULL(排序后链表)head 1->next 2->next 3->next
14、 n->next图14:有N个节点的链表冒泡排序任意两个相邻节点p、q位置互换图示:假设p1->next指向p,那么显然p1->next->next就指向q,p1->next->next->next就指向q的后继节点,我们用p2保存p1->next->next指针。即:p2=p1->next->next,则有: ->p->q-> (排序前)p1->next p1->next->next p2->next图15 ->q->p-> (排序后)图161、排序后q节点指向p节点
15、,在调整指向之前,我们要保存原p的指向节点地址,即:p2=p1->next->next;2、顺着这一步一步往下推,排序后图16中p1->next->next要指的是p2->next,所以p1->next->next=p2->next;3、在图15中p2->next原是q发出来的指向,排序后图16中q的指向要变为指向p的,而原来p1->next是指向p的,所以p2->next=p1->next;4、在图15中p1->next原是指向p的,排序后图16中p1->next要指向q,原来p1->next->
16、next(即p2)是指向q的,所以p1->next=p2;5、至此,我们完成了相邻两节点的顺序交换。6、下面的程序描述改进了一点就是记录了每次最后一次节点下沉的位置,这样我们不必每次都从头到尾的扫描,只需要扫描到记录点为止。 因为后面的都已经是排好序的了。*/struct student *BubbleSort(struct student *head)struct student *endpt; /*控制循环比较*/struct student *p; /*临时指针变量*/struct student *p1; struct student *p2;p
17、1 = (struct student *)malloc(LEN);p1->next = head; /*注意理解:我们增加一个节点,放在第一个节点的前面,主要是为了便于比较。因为第一个节点没有前驱,我们不能交换地址。*/head = p1; /*让head指向p1节点,排序完成后,我们再把p1节点释放掉*/for (endpt=NULL; endpt!=head; endpt=p) /*结合第6点理解*/for (p=p1=head; p1->next->next!=endpt; p1=p1->next) if (p1->next->
18、;num > p1->next->next->num) /*如果前面的节点键值比后面节点的键值大,则交换*/ p2 = p1->next->next; /*结合第1点理解*/ p1->next->next = p2->next; /*结合第2点理解*/ p2->next = p1->next; /*结合第3点理解*/ p1->next = p2; /*结合
19、第4点理解*/ p = p1->next->next; /*结合第6点理解*/ p1 = head; /*把p1的信息去掉*/head = head->next; /*让head指向排序后的第一个节点*/free(p1); /*释放p1*/p1 = NULL; /*p1置为NULL,保证不产生“野指针”,即地址不确定的指针变量*/return head;/*=功能:插入有序链表的某个节点的后面(从小到大)返回:指向链表表头的指针=*/*有序链表插入节点示意图:->NULL(空有序链表)head图18:空有序链表
20、(空有序链表好解决,直接让head指向它就是了。)以下讨论不为空的有序链表。->1->2->3.->n->NULL(有序链表)head 1->next 2->next 3->next n->next图18:有N个节点的有序链表插入node节点的位置有两种情况:一是第一个节点前,二是其它节点前或后。->node->1->2->3.->n->NULLhead node->next 1->next 2->next 3->next
21、 n->next图19:node节点插在第一个节点前->1->2->3.->node.->n->NULLhead 1->next 2->next 3->next node->next n->next图20:node节点插在其它节点后*/struct student *SortInsert(struct student *head, struct student *node)struct student *p; /*p保存当前需要检查的节点的地址*/ struct student *t; /*临时指针变量*/if (head = NULL) /*处理空的有序链表*/head = node;node->next = NULL;n += 1; /*插入完毕,节点总数加1*/return head;p = head; /*有序链表不为空*/while (p->num < node->num && p != NULL) /*p指向的节点的学号比插入节点的学号小,并且它不等于NULL*/t = p; /*保存当前节点
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 迪士尼公主介绍课件
- 中考语文文言文对比阅读(全国)10 《陋室铭》对比阅读(15组73题)(解析版)
- 物业消防知识竞赛试题及答案
- 十堰爱尔眼科医院2025年N0-N1级护士理论考试试题及答案
- 内科主治医师考试《专业知识》预习试题及答案
- 车队人员安全培训内容课件
- 2026年收费员年度考核表个人工作总结(2篇)
- 酒店员工考勤与薪酬制度
- 车间级安全培训感想课件
- 2025年品牌自播体系搭建与常态化直播运营工作心得(2篇)
- 2025-2030中国生物炼制行业市场现状供需分析及投资评估规划分析研究报告
- 透析患者营养不良课件
- 国家开放大学《营销策划案例分析》形考任务5答案
- 220kv安全培训课件
- 计量测量基础知识培训课件
- 2025年云南省中考物理真题(含答案)
- 基于杜邦分析的零售企业盈利能力研究-以来伊份为例
- 脑机协同学习-洞察及研究
- 《内蒙古自治区中小学(中等职业学校)课程教学管理规范(试行)》
- 第三方安全评估管理办法
- 环境工程污水处理技术题库
评论
0/150
提交评论