将L先拆成一个只有一个节点的有序表,用P指向L的元素。第一次将L的第一个节点与P比较(这时候的P指向的是L的第二个元素),如果小于则退出第一个循环将P插入pre之后(这时pre指向的是头结点)。插入之后P向后移,L现在由一个元素变为两个元素,且L仍为有序表。
假设L现在有十个元素,P指向原来L的第十一个元素,现在将L中的每个元素与P进行比较,当P小于L中某一个元素时,就将P插入该元素的前一个元素。L仍然为一个有序表
最后循环完成后,就通过P将L中每个元素进行了排序。
void sort(LinkList *&L)
{ LinkList *p,*pre,*q;
p=L->next->next; //p指向L的第2个数据节点
L->next->next=NULL; //构造只含一个数据节点的有序表
while (p!=NULL)
{ q=p->next; //q保存*p节点后继节点的指针
pre=L; //从有序表开头进行比较,pre指向插入*p的前驱节点
while (pre->next!=NULL && pre->next->data<p->data)
pre=pre->next; //在有序表中找插入*p的前驱节点*pre
p->next=pre->next;//将*pre之后插入*p
pre->next=p;
p=q; //扫描原单链表余下的节点
}
}