|     first = 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;          //保存找到节点的前驱节点:显然p->next的前驱节点是p
 min = p->next;      //保存键值更小的节点
 }
 }
         //上面for语句结束后,就要做两件事;一是把它放入有序链表中;二是根据相应的条件判断,安排它离开原来的链表         //第一件事if (first == NULL)       //如果有序链表目前还是一个空链表
 {
 first = min;        //第一次找到键值最小的节点
 tail = min;           //注意:尾指针让它指向最后的一个节点
 }
 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离开了原链表
 }
 }
     if (first != NULL)        //循环结束得到有序链表first{
 tail->next = NULL;    //单向链表的最后一个节点的next应该指向NULL
 }
 head = first;
 return head;
 }
 对链表进行直接插入排序的基本思想就是假设链表的前面n-1个节点是已经按键值(就是用它排序的字段,我们取学号num为键值)排好序的,对于节点n在这个序列中找插入位置,使得n插入后新序列仍然有序。按照这种思想,依次对链表从头到尾执行一遍,就可以使无序链表变为有序链表。       单向链表的直接插入排序图示:---->[1]---->[3]---->[2]...---->[n]---->[NULL](原链表)
 head   1->next  3->next  2->next   n->next
       ---->[1]---->[NULL](从原链表中取第1个节点作为只有一个节点的有序链表)head
 图11
 (编辑:锡盟站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |