简单易懂 链表冒泡排序

//此程序是面对和我一样面对冒泡指针不知所措的同志们的一个简单程序
//在网上看的大多青涩难懂 我在这里给大家生动形象了一下 大神就看看不吭气,真的帮住到同志们才是真的好
#include<iostream>
using namespace std;
struct list
{
 int num;
 struct list *next;
};
int n;  //你想对多少数排序呢?
int main()
{
 list *head,*p,*p1,*p2;  //头指针 p1用来做输入指针 p2做协助指针
 cin>>n;
 
 
 
 p1=p2=new list;//开辟空间 然后就指向他咯
 head=NULL;     //列表是空滴
 int flag=1;   //分配头指针的问题
 while(n--)
 {
  cin>>p1->num;
  if(flag==1)
  {
   flag=0;
   head=p1; //头指针指向第一个数据
  }
  else p2->next=p1;  //开来头指针有人占了 那我占下一个(链接下一个数据)
  p2=p1;//协助指针终于排上用场了 我来帮你们处理数据链接的问题
  if(n!=0) p1=new list;//开辟一个空间给下一个数据住
 }
 p2->next=NULL;//最后一个数据应该链接一个0
 
  以上是链表数据的输入
 p1=new list;  //创建一个空间放到头指针前面 占领他的领地
 p1->next=head; //连上就放置成功了
 head=p1;//看来占领成功了嘛
 list *pt;  //再建立一个工作指针
//此处是冒泡排序的小小优化 外循环意思是每次需要比较的元素的个数都在变小//
// 因为外循环一次 就有一个元素沉底 该元素就不用处理了 因此 一次一次的减少直到 减少到头指针后面的一个元素 为止
 for(pt=NULL;pt!=head;pt=p)
  for(p=p1=head;p1->next->next!=pt;p1=p1->next)//p p1 开始指向头指针地址
        {//为什么终止条件是 p1->next->next!=pt 呢 因为此处p1是一个工作指针 p1->next p1-next-next 是每次内循环需要比较的值
                //如果p1->next->next这个元素不存在, 那肯定是不存在的 哈哈 !=pt是因为 每次外循环下沉的元素不加入比较 so p1->next->next!=pt
         if(p1->next->num>p1->next->next->num)
         {
          p2=p1->next->next;
          p1->next->next=p2->next;
          p2->next=p1->next;
          p1->next=p2;
          p=p1->next->next;
   }
  }
  //此处操作是将p1 撤销
 p1=head;
 head=head->next;
 delete p1;
 p1=NULL;
 
 ///这里是冒泡排序的精华
 
 p=head;   //工作指针
 if(head!=NULL)
 do
 {
  cout<<p->num<<" ";  //一个一个输出
  p=p->next;  //指向下一个
 }while(p!=NULL);
 
 //以上是输出
 return 0;
}


 
 
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值