65,208
社区成员
发帖
与我相关
我的任务
分享void sort(node* head)
{
node *pre,*p1,*p2; //定义节点指针
node *tail=0;
int nLen=0;//链表长度
p1=head; // 把头节点给p1
while(p1) // 只要有p1没有结束就循环
{
nLen++; // 长度加1
p1=p1-> next; // p1指向下一个元素
}
if(nLen==0 || nLen==1)
return; // 如果链表长度等于0或1就结束程序
p1=head;p2=p1-> next; //p1指向头结点、p1下一个节点给p2
for(int i=1;i <nLen;++i) //对nLen长的链表,执行nLen-1次冒泡
{
while(p2!=tail) // 当p2没有指向链表尾部就循环
{
//交换
if(p1-> data > p2-> data) // 如果p1指向的元素大于p2指向的元素
{
if(p1==head){ // 如果p1是链表的头
p1-> next=p2-> next; // p2的下一个给p1的下一个
p2-> next=p1; // p1给p2的下一个
pre=p2; // p2给pre
p1=pre-> next; // pre下一个给p1
p2=p1-> next; // p1下一个给p2 这里画个图就能看清楚了!!!
}
else // 如果p1不是链表的头,内容基本同上!画图能看清楚
{
pre-> next=p2;
p1-> next=p2-> next;
p2-> next=p1;
p1=pre-> next;p2=p1-> next;
}
}
// 如果p1指向的元素不大于p2指向的元素
pre=p1; // p1赋个pre
p1=p1-> next; // p1下一个元素
p2=p2-> next; // p2下一个元素
}
//一趟排序完毕,tail指向已排好序部分的第一个
tail=p1;p1=head;p2=p1-> next;
}
}