
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
照说应该执行函数一次就会排好啊 展开
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
照说应该执行函数一次就会排好啊 展开
3个回答
展开全部
你这个冒泡只虽然是两次循环,但做的工作还是只有一次循环交换;
因为你的循环中,外层执行一次后,你的指针就已经指向尾部了(下次循环时,指针并没有重新指向头)。此时,如果你循环里有判断尾结点了tail->next是否为NULL,就会发现问题。你实际代码中没有判断已经很危险了。
建议楼主好好调试一下运行过程。
因为你的循环中,外层执行一次后,你的指针就已经指向尾部了(下次循环时,指针并没有重新指向头)。此时,如果你循环里有判断尾结点了tail->next是否为NULL,就会发现问题。你实际代码中没有判断已经很危险了。
建议楼主好好调试一下运行过程。
展开全部
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;
}
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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
算算,你第一次执行时,PRE指向的在第一次执行有没有冒
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询