链表的快速排序不对

wind19 2009-07-23 11:17:50
写了一个链表的快速排序,但排了几次之后就不对了,而且会crash,找了半天也不知道什么原因,各位路过的帮忙看一下,不胜感激。

#include <stdio.h>
#include <stdlib.h>

typedef struct NODE
{
int data;
struct NODE * next;
}node;

node * create_link()
{
node * p1 = (node *)malloc(sizeof(node));
node * p2 = (node *)malloc(sizeof(node));
node * p3 = (node *)malloc(sizeof(node));
node * p4 = (node *)malloc(sizeof(node));
node * p5 = (node *)malloc(sizeof(node));
node * p6 = (node *)malloc(sizeof(node));
node * p7 = (node *)malloc(sizeof(node));
node * p8 = (node *)malloc(sizeof(node));
node * p9 = (node *)malloc(sizeof(node));
node * p10 = (node *)malloc(sizeof(node));

p1->data = 5;
p1->next = p2;

p2->data = 3;
p2->next = p3;

p3->data = 6;
p3->next = p4;

p4->data = 1;
p4->next = p5;

p5->data = 2;
p5->next = p6;

p6->data = 8;
p6->next = p7;

p7->data = 7;
p7->next = p8;

p8->data = 10;
p8->next = p9;

p9->data = 9;
p9->next = p10;

p10->data = 4;
p10->next = NULL;

return p1;

}

void swap(node * n1, node * n2)
{
int temp = n1->data;
n1->data = n2->data;
n2->data = temp;
}

node * qsort(node * phead, node * ptail)
{
node * pleft=phead, *plast=phead, *pcur=phead,*pprelast=phead, *temp =NULL, *pre=NULL;

if(phead != NULL && ptail != NULL)
printf("phead is %d , ptail is %d\n",phead->data,ptail->data);

if(phead == NULL || phead->next == NULL || phead == ptail)
return phead;


pcur=phead->next;
plast = phead;

//pre=pprelast=phead;

while(pcur != ptail)
{
if (pcur->data < pleft->data)
{
swap(pcur,plast->next);
pprelast = plast;
plast=plast->next;
}
pcur = pcur->next;
}

if (pcur->data < pleft->data)
{
swap(pcur,plast->next);
pprelast = plast;
plast=plast->next;
}

swap(pleft,plast);

printf("plast is %d , pprelast is %d, plast->next is %d\n",plast->data,pprelast->data,plast->next->data);

temp = phead;
while(temp != NULL)
{
printf("%d ",temp->data);
temp = temp->next;
}
printf("\n");

qsort(pleft,pprelast);
qsort(plast->next,ptail);

return phead;

}

int main(void)
{
node * phead = create_link();
node * temp = phead, *pre=phead;

printf("before sort: ");
while(temp != NULL)
{
printf("%d ",temp->data);
pre=temp;
temp = temp->next;
}
printf("\n");

qsort(phead,pre);
printf("after sort: ");
while(temp != NULL)
{
printf("%d ",temp->data);
temp = temp->next;
}
printf("\n");


return 0;

}
...全文
80 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lyw110 2009-07-23
  • 打赏
  • 举报
回复
哦,sorry,我自己搞错了
Lyw110 2009-07-23
  • 打赏
  • 举报
回复
void swap(node * n1, node * n2)
{
int temp = n1->data;
n1->data = n2->data;
n2->data = temp;
}

这个应该交换不到数据吧。改成引用看看。
void swap(node& * n1, node& * n2)
{
int temp = n1->data;
n1->data = n2->data;
n2->data = temp;
}
The_facE 2009-07-23
  • 打赏
  • 举报
回复

node * create_link()
{
node * p1 = (node *)malloc(sizeof(node));
node * p2 = (node *)malloc(sizeof(node));
node * p3 = (node *)malloc(sizeof(node));
node * p4 = (node *)malloc(sizeof(node));
node * p5 = (node *)malloc(sizeof(node));
node * p6 = (node *)malloc(sizeof(node));
node * p7 = (node *)malloc(sizeof(node));
node * p8 = (node *)malloc(sizeof(node));
node * p9 = (node *)malloc(sizeof(node));
node * p10 = (node *)malloc(sizeof(node));

p1->data = 5;
p1->next = p2;

p2->data = 3;
p2->next = p3;

p3->data = 6;
p3->next = p4;

p4->data = 1;
p4->next = p5;

p5->data = 2;
p5->next = p6;

p6->data = 8;
p6->next = p7;

p7->data = 7;
p7->next = p8;

p8->data = 10;
p8->next = p9;

p9->data = 9;
p9->next = p10;

p10->data = 4;
p10->next = NULL;

return p1;

}



别这样申请链表,写个循环多省事...

你先在排序函数里面单步调试一下看看,一定是哪个指针置错了。
kojie_chen 2009-07-23
  • 打赏
  • 举报
回复
加分
cyldf 2009-07-23
  • 打赏
  • 举报
回复
断点调试,查看每个阶段相关变量的值,看哪里指针弄错了。
wind19 2009-07-23
  • 打赏
  • 举报
回复
呵呵,我是想生成固定的链表,我调试了,刚开始几次排序都对的,后来传进去的指针就不对了,没有想明白。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧