永发信息网

这是单链表实现冒泡排序的算法,为什么1没有参加排序?哪错了?

答案:2  悬赏:0  手机版
解决时间 2021-04-26 03:35
  • 提问者网友:情歌越听越心酸
  • 2021-04-25 02:49

上面是运行结果,帮忙看看哪里出现了逻辑错误

#include "stdio.h"
typedef int ElemType;
typedef struct node
{ElemType data;
struct node *next;
}slink;
slink *creslink(int n)
{ slink *head,*p,*s;
int i;
if(n<1)return NULL;
p=head=(slink *)malloc(sizeof(slink));
for(i=1;i<=n;i++)
{s=(slink *)malloc(sizeof(slink));
scanf("%d",&s->data);
p->next=s;
p=s;
}
p->next=NULL;
return head;
}
void sort(slink *L)
{slink *p,*q,*end;
ElemType r;
end=L->next;
while(end->next!=NULL)end=end->next;
p=L->next;
while(L->next->next!=end)
{p=L->next;q=p->next;
while(q!=end)
{if(p->data>q->data)
{r=p->data;p->data=q->data;q->data=r;}
p=q;q=q->next;
}
end=p;
}
}
void list(slink *head)
{slink *p;
p=head->next;
while(p!=NULL)
{ printf("%4d",p->data);
p=p->next;
}
printf("\n");
}
main()
{slink *L;
L=creslink(7);
list(L);
sort(L);
list(L);
getch();
}

最佳答案
  • 五星知识达人网友:时间的尘埃
  • 2021-04-25 03:55

由于end指向了内容为1的节点.而后面的循环判断都是当指针不等于end的时候.所以end就不会被循环判断到. 那么很明显1就不会参与到冒泡中..



void sort(slink *L)
{
slink *p,*q,*end;
ElemType r;
end=L->next;
while(end!=NULL)end=end->next; //这里.
p=L->next;
while(L->next->next!=end)
{
p=L->next;q=p->next;
while(q!=end)
{
if(p->data>q->data)
{
r=p->data;p->data=q->data;q->data=r;
}
p=q;q=q->next;
}
end=p;
}
}


全部回答
  • 1楼网友:神鬼未生
  • 2021-04-25 04:52

边界判断错误。

直接把sort函数中的

end=L->next; while(end->next!=NULL)end=end->next;

去掉。

改为end = NULL;就行了。

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯