鏈表插入排序(insertion-sort-list)


   自己寫的代碼有幾個比較大的用例一直過不去,網上的代碼大部分有問題,思路是先將鏈表置空表,再將鏈表中的元素循環插入到指定位置。

  下面是一份正確的代碼,但是是帶頭節點的鏈表

void Insertsort(Linklist &L)
{
    LNode *p,*q,*r,*u;
    p=L->next;L->next=NULL;  //置空表,然后將原鏈表結點逐個插入到有序表中
    while(p!=NULL)
   {          //當鏈表尚未到尾,p為工作指針
        r=L;q=L->next;
        while(q!=NULL&&q->data<=p->data)
       {  //查P結點在鏈表中的插入位置,這時q是工    作指針
            r=q;q=q->next;
        }
        u=p->next;
        p->next=r->next;
        r->next=p;
        p=u; //將P結點鏈入鏈表中,r是q的前驅,u是下一個待插入結點的指針
    }
}   

 本題是沒有頭節點的鏈表,修改后如下:

void Insertsort(Linklist &L)
{
  ListNode *p,*u,*r,*q,*s; /*h2用來指向需要插入的結點,h3用來指向h2的前一個結點 
  p=L->next; 
  L->next=NULL; //置空表,然后將原鏈表結點逐個插入到有序表中 
  while(p!=NULL) 
  { //當鏈表尚未到尾,p為工作指針 
    r=L; 
    q=L->next; 
    if(p->val < L->val) 
    { 
      s=L; 
      u=p->next; 
      p->next=L; 
      L=p; 
      p=u; 
    } 
    else 
    { 
      while(q!=NULL&&q->val<=p->val) 
      { //查P結點在鏈表中的插入位置,這時q是工作指針 
         r=q;
         q=q->next; 
      } 
      u=p->next; 
      p->next=r->next; 
      r->next=p; 
      p=u; //將P結點鏈入鏈表中,r是q的前驅,u是下一個待插入結點的指針 
    } 
  }
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM