2022年C语言链表排序讲课稿.pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《2022年C语言链表排序讲课稿.pdf》由会员分享,可在线阅读,更多相关《2022年C语言链表排序讲课稿.pdf(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C 语 言 链 表 排 序精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 1 页,共 14 页 - - - - - - - - - - = 功能:选择排序(由小到大 ) 返回:指向链表表头的指针= */ /* 选择排序的基本思想就是反复从还未排好序的那些节点中,选出键值(就是用它排序的字段,我们取学号num 为键值)最小的节点,依次重新组合成一个链表。我认为写链表这类程序,关键是理解:head 存储的是第一个节点的地址,head-next存储的是第二个节点的地址;任意一个节点p 的地址,只能通过它前一个节
2、点的next 来求得。单向链表的选择排序图示:-1-3-2.-n-NULL(原链表)head 1-next 3-next 2-next n-next -NULL (空链表)first tail -1-2-3.-n-NULL(排序后链表)first 1-next 2-next 3-next tail-next 图 10:有 N 个节点的链表选择排序1、先在原链表中找最小的,找到一个后就把它放到另一个空的链表中;2、空链表中安放第一个进来的节点,产生一个有序链表,并且让它在原链表中分离出来(此时要注意原链表中出来的是第一个节点还是中间其它节点);精品资料 - - - 欢迎下载 - - - - -
3、- - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 2 页,共 14 页 - - - - - - - - - - 3、继续在原链表中找下一个最小的,找到后把它放入有序链表的尾指针的next,然后它变成其尾指针;*/ struct student *SelectSort(struct student *head) struct student *first; /*排列后有序链的表头指针*/ struct student *tail; /*排列后有序链的表尾指针*/ struct student *p_min; /*保留键值更小的节点的前驱节点的指针*/ stru
4、ct student *min; /*存储最小节点 */ struct student *p; /*当前比较的节点*/ first = NULL; while (head != NULL) /*在链表中找键值最小的节点。*/ /*注意:这里for 语句就是体现选择排序思想的地方*/ for (p=head,min=head; p-next!=NULL; p=p-next) /*循环遍历链表中的节点,找出此时最小的节点。 */ if (p-next-num num) /*找到一个比当前min 小的节点。 */ p_min = p; /*保存找到节点的前驱节点:显然p-next 的前驱节点是p。*
5、/ min = p-next; /*保存键值更小的节点。*/ 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 3 页,共 14 页 - - - - - - - - - - /*上面 for 语句结束后,就要做两件事;一是把它放入有序链表中;二是根据相应的条件判断,安排它离开原来的链表。*/ /*第一件事 */ if (first = NULL) /*如果有序链表目前还是一个空链表*/ first = min; /*第一次找到键值最小的节点。*/ tail = min; /* 注意:尾指针让它指向最后的一个
6、节点。*/ else /* 有序链表中已经有节点*/ tail-next = min; /*把刚找到的最小节点放到最后,即让尾指针的next 指向它。 */ tail = min; /* 尾指针也要指向它。*/ /*第二件事 */ if (min = head) /*如果找到的最小节点就是第一个节点*/ head = head-next; /*显然让 head 指向原 head-next, 即第二个节点,就OK*/ else /* 如果不是第一个节点*/ p_min-next = min-next; /*前次最小节点的next 指向当前min 的 next, 这样就让min 离开了原链表。 *
7、/ 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 4 页,共 14 页 - - - - - - - - - - if (first != NULL) /*循环结束得到有序链表first*/ tail-next = NULL; /*单向链表的最后一个节点的next 应该指向 NULL*/ head = first; return head; /* = 功能:直接插入排序(由小到大 ) 返回:指向链表表头的指针= */ /* 直接插入排序的基本思想就是假设链表的前面n-1 个节点是已经按键值(就是用它排序的
8、字段,我们取学号num 为键值)排好序的,对于节点n 在这个序列中找插入位置,使得n 插入后新序列仍然有序。按照这种思想,依次对链表从头到尾执行一遍,就可以使无序链表变为有序链表。单向链表的直接插入排序图示:-1-3-2.-n-NULL(原链表)head 1-next 3-next 2-next n-next -1-NULL(从原链表中取第1 个节点作为只有一个节点的有序链表)精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 5 页,共 14 页 - - - - - - - - - - head 图 11
9、-3-2.-n-NULL(原链表剩下用于直接插入排序的节点)first 3-next 2-next n-next 图 12 -1-2-3.-n-NULL(排序后链表)head 1-next 2-next 3-next n-next 图 13:有 N 个节点的链表直接插入排序1、先在原链表中以第一个节点为一个有序链表,其余节点为待定节点。2、从图 12 链表中取节点,到图11 链表中定位插入。3、上面图示虽说画了两条链表,其实只有一条链表。在排序中,实质只增加了一个用于指向剩下需要排序节点的头指针first 罢了。这一点请读者务必搞清楚,要不然就可能认为它和上面的选择排序法一样了。*/ stru
10、ct 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 来理解。 */ whil
11、e (first != NULL) /*遍历剩下无序的链表*/ 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 6 页,共 14 页 - - - - - - - - - - /*注意:这里for 语句就是体现直接插入排序思想的地方*/ for (t=first, q=head; (q!=NULL) & (q-num num); p=q, q=q-next); /*无序节点在有序链表中找插入的位置*/ /*退出 for 循环,就是找到了插入的位置*/ /*注意:按道理来说,这句话可以放到下面注释了的那个位置
12、也应该对的,但是就是不能。原因:你若理解了上面的第3 条,就知道了。*/ first = first-next; /*无序链表中的节点离开,以便它插入到有序链表中。*/ if (q = head) /*插在第一个节点之前*/ head = t; else /*p 是 q 的前驱 */ p-next = t; t-next = q; /* 完成插入动作 */ /*first = first-next;*/ return head; /* 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 7 页,共 14 页
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022 语言 排序 讲课
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内