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