自己寫的代碼有幾個比較大的用例一直過不去,網上的代碼大部分有問題,思路是先將鏈表置空表,再將鏈表中的元素循環插入到指定位置。
下面是一份正確的代碼,但是是帶頭節點的鏈表:
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是下一個待插入結點的指針 } } }