链表的快速排序不对
写了一个链表的快速排序,但排了几次之后就不对了,而且会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;
}