关于链表冒泡排序的问题,以下是一个链表排序的函数,不明白q在这里面是怎样发挥“标记”作用的。

intsquence(structlnode*head){//冒泡排序列表if(head==NULL||head->next==NULL)return1;lnode*p;... int squence(struct lnode *head)
{ //冒泡排序列表 if(head==NULL||head->next==NULL)return 1 ;
lnode *p;
int data,q;
// bool sorted = false;
q=0;
while(q=!q)
{ // 表达式返回true,继续下一轮冒泡
for(p=head;p->next!=NULL;p=p->next)
{ if(p->data > (p->next)->data)
{ //与紧邻的下一个node比较data的大小
data=(p->next)->data;
(p->next)->data=p->data;
p->data=data; //交换data
q=0; // 标记“发生了交换”,如果没有交换则跳出while循环
}
}
}
return 1;
}
这是一个冒泡排序的函数
展开
 我来答
Soucula
2013-04-03 · TA获得超过3093个赞
知道小有建树答主
回答量:744
采纳率:93%
帮助的人:88.5万
展开全部
(1) while(q=!q)//q = !q 若q==0 则q = !q = !0 =1 则while循环条件成立否则q = !q = !1 = 0此时循环条件不成立退出循环。
(2)每趟比较之前q = !q都使得q==1,此时若在内循环中没有将q赋值为0,则会在下一趟循环时使得q=!q==0,从而退出循环,起到了标记当前比较趟中没有数据交换的作用。
(3)在冒泡排序中若当前趟已无数据需要交换次序,则说明整个序列已经有序无需继续排序。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式