//冒泡排序
struct node{
int val;
node * next;
node():next(NULL){}
};
int main()
{
//输入链表的个数,和链表数据,并创建链表
node *head=NULL,*p=NULL;
int len;
cin>>len;
for(int i=0;i<len;i++){
node *new_node=new(node);
cin>>new_node->val;
if(head==NULL){
head=new_node;
p=head;
}
else{
p->next=new_node;
p=p->next;
}
}
//输入的链表
node *x=head;
while(x!=NULL){
cout<<x->val;
x=x->next;
}
cout<<endl;
//开始冒泡排序
for(int i=0;i<len-1;i++){
//单独判断头节点和它后面一个节点的大小关系
if(head->val>head->next->val){
node * pp=head;
head=head->next;
pp->next=head->next;
head->next=pp;
}
//记录前一个节点pre,和当前节点p(如果不单独判断头节点,那么pre==p==head,于是在交换节点时候有bug)
node *pre=head,*p=head;
for(int j=0;j<len-1-i;j++){
if(p->val>p->next->val){ //交换节点
pre->next=p->next;
p->next=pre->next->next;
pre->next->next=p;
}
else //没有发生节点交换时,才需要更新p,否则,由于节点交换后p位置后移一位,所以就没有更新的必要了
p=p->next;
if(j>0) //更新前节点
pre=pre->next;
}
//观察排序过程
x=head;
while(x!=NULL){
cout<<x->val;
x=x->next;
}
cout<<endl;
//
}
return 0;
}
链表排序
最新推荐文章于 2025-03-29 18:34:40 发布