c 语言链表冒泡排序,出错了,求原因

STU为结构体名,len为链表长度intsort_ID(STU*head,intlen){inti,j;if(len<2)return0;STU*pre=head;//前... STU 为结构体名,len为链表长度

int sort_ID(STU *head,int len){
int i,j;
if(len < 2)
return 0;
STU *pre = head; //前一节点
STU *cur = head->next; //交换的节点
STU *tail = cur->next; //交换的节点
for(i=1;i<len;i++){
for(j=1;j<len-i;j++){
if(strcmp(cur->ID,tail->ID) > 0){
pre->next = tail; //交换
cur->next = tail->next;
tail->next = cur;

pre = tail; //交换成功后移
tail = cur->next;
}else{
pre = cur; //未交换平移
cur = tail;
tail = tail->next;
}
}
}
return 0;
}

排序感觉执行次数不对,比如链表数据中的ID为4 3 2 1
执行后结果为3 2 1 4
再执行变为:2 1 3 4
再执行变为:1 2 3 4
照说应该执行函数一次就会排好啊
展开
 我来答
江户川跑男
2012-10-04 · 超过16用户采纳过TA的回答
知道答主
回答量:42
采纳率:0%
帮助的人:42.1万
展开全部
你这个冒泡只虽然是两次循环,但做的工作还是只有一次循环交换;
因为你的循环中,外层执行一次后,你的指针就已经指向尾部了(下次循环时,指针并没有重新指向头)。此时,如果你循环里有判断尾结点了tail->next是否为NULL,就会发现问题。你实际代码中没有判断已经很危险了。
建议楼主好好调试一下运行过程。
xwtlyss126
2012-10-04 · 超过12用户采纳过TA的回答
知道答主
回答量:39
采纳率:100%
帮助的人:20.6万
展开全部
int sort_ID(STU *head,int len){
int i,j;
if(len < 2)
return 0;
STU *pre = head; //前一节点
STU *cur = head->next; //交换的节点
STU *tail = cur->next; //交换的节点
for(i=1;i<len;i++){
for(j=0;j<len-i;j++){
if(strcmp(cur->ID,tail->ID) > 0){
pre->next = tail; //交换
cur->next = tail->next;
tail->next = cur;

pre = tail; //交换成功后移
tail = cur->next;
}else{
pre = cur; //未交换平移
cur = tail;
tail = tail->next;
}
}
//重新下一轮查找
pre = head; //前一节点
cur = head->next; //交换的节点
tail = cur->next; //交换的节点

}
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wmf540527604
2012-10-04 · 超过12用户采纳过TA的回答
知道答主
回答量:66
采纳率:0%
帮助的人:22.5万
展开全部
算算,你第一次执行时,PRE指向的在第一次执行有没有冒
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式