user-0 提问: 冒泡排序对链表排序，为什么只执行了一次？

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 代码没细看，但既然是链表，那就最好不要用for(x=0;x<N-1;++x)之类的来作为循环条件,这样的容易访问空指针，导致程序异常 正确的做法是 while(p) { ...... p = p->next; } 这样的代码，阅读性也好

user: user-0
content: 引用 7 楼 柒贰伍玖的回复:这个写法容易出错，例如p和p的next在还没确定是不是空的情况下就去访问其属性，程序会出现无法预知错误 在执行这个函数之前有另一函数进行赋值了，不为空，排序也是交换地址，哪里容易出错呢

user: user-0
content: 在执行这个函数之前有另一函数进行赋值了，不为空，排序也是交换地址，哪里容易出错呢？

user: user-3
content: 这个写法容易出错，例如p和p的next在还没确定是不是空的情况下就去访问其属性，程序会出现无法预知错误

user: user-0
content: 引用 5 楼 自信男孩的回复:[quote=引用 4 楼 37504222 的回复:] [quote=引用 1 楼 自信男孩的回复:]直接贴代码吧～  冒泡排序，建议直接交换链表的数据部分，这样处理更清晰，更容易，而交换节点，有一定难度～ void g(struct t *head) {   struct t *p,*q,*k;   int x,y;   for(x=0;x<N-1;++x)    { p=head;printf("%.2f %.2f %.2f\n",head->next->money,head->next->next->money,head->next->next->next->money);    for(y=0;y<N-x-1;++y)   {if(p->next->money<p->next->next->money)      {q=p->next;       k=p->next->next->next;       p->next=p->next->next;       p->next->next=q;       p->next->next->next=k;}       printf("%.2f %.2f %.2f\n",p->next->money,p->next->next->money,p->next->next->next->money);       p=p->next;    }    } }[/quote] 用交换数据部分试一下，这种方法比较简单～[/quote] 那我这个冒泡排序的写法错了吗？

user: user-4
content: 引用 4 楼 37504222 的回复:[quote=引用 1 楼 自信男孩的回复:]直接贴代码吧～  冒泡排序，建议直接交换链表的数据部分，这样处理更清晰，更容易，而交换节点，有一定难度～ void g(struct t *head) {   struct t *p,*q,*k;   int x,y;   for(x=0;x<N-1;++x)    { p=head;printf("%.2f %.2f %.2f\n",head->next->money,head->next->next->money,head->next->next->next->money);    for(y=0;y<N-x-1;++y)   {if(p->next->money<p->next->next->money)      {q=p->next;       k=p->next->next->next;       p->next=p->next->next;       p->next->next=q;       p->next->next->next=k;}       printf("%.2f %.2f %.2f\n",p->next->money,p->next->next->money,p->next->next->next->money);       p=p->next;    }    } }[/quote] 用交换数据部分试一下，这种方法比较简单～

user: user-0
content: 引用 1 楼 自信男孩的回复:直接贴代码吧～  冒泡排序，建议直接交换链表的数据部分，这样处理更清晰，更容易，而交换节点，有一定难度～ void g(struct t *head) {   struct t *p,*q,*k;   int x,y;   for(x=0;x<N-1;++x)    { p=head;printf("%.2f %.2f %.2f\n",head->next->money,head->next->next->money,head->next->next->next->money);    for(y=0;y<N-x-1;++y)   {if(p->next->money<p->next->next->money)      {q=p->next;       k=p->next->next->next;       p->next=p->next->next;       p->next->next=q;       p->next->next->next=k;}       printf("%.2f %.2f %.2f\n",p->next->money,p->next->next->money,p->next->next->next->money);       p=p->next;    }    } }

user: user-0
content: 运行结果只有一次交换

user: user-0
content: void g(struct t *head) {   struct t *p,*q,*k;   int x,y;   for(x=0;x<N-1;++x)    { p=head;printf("%.2f %.2f %.2f\n",head->next->money,head->next->next->money,head->next->next->next->money);    for(y=0;y<N-x-1;++y)   {if(p->next->money<p->next->next->money)      {q=p->next;       k=p->next->next->next;       p->next=p->next->next;       p->next->next=q;       p->next->next->next=k;}       printf("%.2f %.2f %.2f\n",p->next->money,p->next->next->money,p->next->next->next->money);       p=p->next;    }    } }

user: user-4
content: 直接贴代码吧～  冒泡排序，建议直接交换链表的数据部分，这样处理更清晰，更容易，而交换节点，有一定难度～