链表排序——选择排序法(纯C语言版)

来源:互联网 发布:plc模拟量编程实例 编辑:程序博客网 时间:2024/06/06 02:32
[cpp] view plain copy
 print?
  1. /********************************* 链表的排序  *******************************************/  
  2. /* 
  3. ========================== 
  4.  功能:选择排序(由小到大) 
  5.  返回:指向链表表头的指针 
  6. ========================== 
  7.  
  8.  选择排序的基本思想就是反复从还未排好序的那些节点中, 
  9.  选出键值(就是用它排序的字段,我们取学号num为键值)最小的节点, 
  10.  依次重新组合成一个链表。 
  11.  
  12.  我认为写链表这类程序,关键是理解: 
  13.  head存储的是第一个节点的地址,head->next存储的是第二个节点的地址; 
  14.  任 意一个节点p的地址,只能通过它前一个节点的next来求得。 
  15.  
  16. 单向链表的选择排序图示: 
  17. ---->[1]---->[3]---->[2]...----> [n]---->[NULL](原链表) 
  18. head   1->next  3->next  2->next   n->next 
  19.  
  20. ---->[NULL](空链表) 
  21. first 
  22. tail 
  23. ---->[1]---->[2]---->[3]...---->[n]---->[NULL](排序后链表) 
  24. first   1->next  2->next  3->next   tail->next 
  25.  
  26. 1、先在原链表中找最小的,找到一个后就把它放到另一个空的链表中; 
  27. 2、空链表中安放第一个进来的节点,产生一个有序链表,并且让它在原链表中分离出来(此时要注意原链表中出来的是第一个节点还是中间其它节点); 
  28. 3、继续在原链表中找下一个最小的,找到后把它放入有序链表的尾指针的next,然后它变成其尾指针; 
  29. */  
  30. struct student *SelectSort(struct student *head)  
  31. {  
  32.     struct student *pfirst;      /* 排列后有序链的表头指针 */  
  33.     struct student *ptail;       /* 排列后有序链的表尾指针 */  
  34.     struct student *pminBefore;  /* 保留键值更小的节点的前驱节点的指针 */  
  35.     struct student *pmin;        /* 存储最小节点   */  
  36.     struct student *p;           /* 当前比较的节点 */  
  37.    
  38.     pfirst = NULL;  
  39.     while (head != NULL)         /*在链表中找键值最小的节点。*/  
  40.     {  
  41.     /* 注意:这里for语句就是体现选择排序思想的地方 */  
  42.         for (p = head, pmin = head; p->next != NULL; p = p->next) /*循环遍历链表中的节点,找出此时最小的节点。*/  
  43.         {  
  44.             if (p->next->num < pmin->num) /*找到一个比当前min小的节点。*/  
  45.             {  
  46.                 pminBefore = p;           /*保存找到节点的前驱节点:显然p->next的前驱节点是p。*/  
  47.                 pmin       = p->next;     /*保存键值更小的节点。*/  
  48.             }  
  49.         }  
  50.     
  51.     /*上面for语句结束后,就要做两件事;一是把它放入有序链表中;二是根据相应的条件判断,安排它离开原来的链表。*/  
  52.       
  53.         /*第一件事*/  
  54.         if (pfirst == NULL)     /* 如果有序链表目前还是一个空链表                      */  
  55.         {  
  56.             pfirst = pmin;      /* 第一次找到键值最小的节点。                          */  
  57.             ptail  = pmin;      /* 注意:尾指针让它指向最后的一个节点。                */  
  58.         }  
  59.         else                    /* 有序链表中已经有节点                                */  
  60.         {  
  61.             ptail->next = pmin; /* 把刚找到的最小节点放到最后,即让尾指针的next指向它。*/  
  62.             ptail = pmin;       /* 尾指针也要指向它。                                  */  
  63.         }  
  64.   
  65.         /*第二件事*/  
  66.         if (pmin == head)        /* 如果找到的最小节点就是第一个节点                    */  
  67.         {  
  68.             head = head->next;   /* 显然让head指向原head->next,即第二个节点,就OK       */  
  69.         }  
  70.         else /*如果不是第一个节点*/  
  71.         {  
  72.             pminBefore->next = pmin->next; /*前次最小节点的next指向当前pmin的next,这样就让pmin离开了原链表。*/  
  73.         }  
  74.     }  
  75.   
  76.     if (pfirst != NULL)     /*循环结束得到有序链表first                */  
  77.     {  
  78.         ptail->next = NULL; /*单向链表的最后一个节点的next应该指向NULL */   
  79.     }  
  80.     head = pfirst;  
  81.     return head;  
  82. }  
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 b超显示腿短怎么办 2岁多宝宝不愿意说话怎么办 6岁儿童咬字不清怎么办 两岁宝宝爱看电视怎么办 两岁宝宝喜欢看电视怎么办 三岁宝宝说话不清晰怎么办 儿子快四岁了说话不清楚怎么办 儿子快三岁了说话不清楚怎么办 2岁宝宝受刺激了怎么办 一岁的宝宝口臭怎么办 古话说小孩牙齿掉了怎么办 宝宝三岁胆子小怎么办 小宝宝就是不愿意学说话怎么办 2岁宝宝体重偏重怎么办 三岁宝宝体重偏重怎么办 3岁宝宝说话晚怎么办 孩子吃饭总说话吃饭慢怎么办 我的孩子不聪明怎么办 小孩个子长不高怎么办 晚修自己老喜欢讲话怎么办 宝2岁宝脾气大怎么办 宝宝比同龄孩子发育晚怎么办 早教机构业绩不好怎么办 孩子上早教课哭怎么办 两岁宝宝哭闹不止怎么办 7个月宝宝怕生疏怎么办 5个月宝宝怕洗澡怎么办 4个月宝宝认人怎么办 2岁宝宝语言迟缓怎么办 宝宝老是哭闹不睡觉怎么办 7岁儿童说话晚怎么办 一岁多的婴儿说话晚该怎么办 宝宝甲低300多怎么办 两岁半宝宝还不怎么会讲话怎么办 宝宝两岁半了还不讲话怎么办 两岁宝宝怕生人怎么办 四岁宝宝不说话怎么办 1岁宝宝牙齿黄斑怎么办 儿子俩周半了就是不说话怎么办 两岁宝宝牙齿上有黑渍怎么办 两岁宝宝牙齿发黑怎么办