双方向リストのクイックソートで昇順したいのですが上手く行きません。
何となくはできるのですが所々できない所々があります。(0 0 0 3 1 1みたいな感じです。)
どこがいけないのでしょうか?
#include<stdio.h>#include<stdlib.h>#include "ex4.h"void swap(struct node **left, struct node **right);
void trade(struct node **l, struct node **r,struct node **s , struct node **e);
void sort(struct node **arg_s,struct node**arg_e)
{
struct node *start,*end,*left,*right,*s1,*s2,*e1,*e2;
int pivot;
start = *arg_s;
end =*arg_e;
left =start;
right =end;
pivot=left->data;
while(left!=right&&left->prev!=right)
{
while(left->data <pivot&&left!=right)
{
left=left->next;
}
while(right->data >=pivot&&right!=left)
{
right=right->prev;
}
if(left!=right)
{
trade(&left,&right,&start,&end);
left=left->next;
right=right->prev;
}
}
s1=start;
s2=right->next;
e1=right;
e1->next=NULL;
e2=end;
e2->next=NULL;
if(s1!=e1)
{
sort(&s1,&e1);
}
if(s2!=e2)
{
sort(&s2,&e2);
}
e1->next=s2;
s2->prev=e1;
*arg_s=s1;
*arg_e=e2;
}
void trade(struct node **l, struct node **r,struct node **s , struct node **e)
{
struct node *start,*end,*left,*right;
start = *s;
end =*e;
left =*l;
right =*r;
if(left == start)
{
start = right;
}
else
{
left->prev->next = right;
}
if(right == end)
{
end = left;
}
else
{
right->next->prev = left;
}
left->next->prev = right;
swap(&left->next, &right->next);
right->prev->next = left;
swap(&left->prev, &right->prev);
swap(&left, &right);
*l=left;
*r=right;
*s=start;
*e=end;
}
void swap(struct node **left, struct node **right)
{
struct node *tmp;
tmp = *left;
*left = *right;
*right = tmp;
}
c言語で明日提出の課題があって困っています。
双方向リストのクイックソートで昇順したいのですが上手く行きません。
何となくはできるのですが所々できない所々があります。(0 0 0 3 1 1みたいな感じです。)
どこがいけないのでしょうか?
[code]
#include<stdio.h>#include<stdlib.h>#include "ex4.h"void swap(struct node **left, struct node **right);
void trade(struct node **l, struct node **r,struct node **s , struct node **e);
void sort(struct node **arg_s,struct node**arg_e)
{
struct node *start,*end,*left,*right,*s1,*s2,*e1,*e2;
int pivot;
start = *arg_s;
end =*arg_e;
left =start;
right =end;
pivot=left->data;
while(left!=right&&left->prev!=right)
{
while(left->data <pivot&&left!=right)
{
left=left->next;
}
while(right->data >=pivot&&right!=left)
{
right=right->prev;
}
if(left!=right)
{
trade(&left,&right,&start,&end);
left=left->next;
right=right->prev;
}
}
s1=start;
s2=right->next;
e1=right;
e1->next=NULL;
e2=end;
e2->next=NULL;
if(s1!=e1)
{
sort(&s1,&e1);
}
if(s2!=e2)
{
sort(&s2,&e2);
}
e1->next=s2;
s2->prev=e1;
*arg_s=s1;
*arg_e=e2;
}
void trade(struct node **l, struct node **r,struct node **s , struct node **e)
{
struct node *start,*end,*left,*right;
start = *s;
end =*e;
left =*l;
right =*r;
if(left == start)
{
start = right;
}
else
{
left->prev->next = right;
}
if(right == end)
{
end = left;
}
else
{
right->next->prev = left;
}
left->next->prev = right;
swap(&left->next, &right->next);
right->prev->next = left;
swap(&left->prev, &right->prev);
swap(&left, &right);
*l=left;
*r=right;
*s=start;
*e=end;
}
void swap(struct node **left, struct node **right)
{
struct node *tmp;
tmp = *left;
*left = *right;
*right = tmp;
}
c言語で明日提出の課題があって困っています。
双方向リストのクイックソートで昇順したいのですが上手く行きません。
何となくはできるのですが所々できない所々があります。(0 0 0 3 1 1みたいな感じです。)
どこがいけないのでしょうか?
[code]
#include<stdio.h>#include<stdlib.h>#include "ex4.h"void swap(struct node **left, struct node **right);
void trade(struct node **l, struct node **r,struct node **s , struct node **e);
void sort(struct node **arg_s,struct node**arg_e)
{
struct node *start,*end,*left,*right,*s1,*s2,*e1,*e2;
int pivot;
start = *arg_s;
end =*arg_e;
left =start;
right =end;
pivot=left->data;
while(left!=right&&left->prev!=right)
{
while(left->data <pivot&&left!=right)
{
left=left->next;
}
while(right->data >=pivot&&right!=left)
{
right=right->prev;
}
if(left!=right)
{
trade(&left,&right,&start,&end);
left=left->next;
right=right->prev;
}
}
s1=start;
s2=right->next;
e1=right;
e1->next=NULL;
e2=end;
e2->next=NULL;
if(s1!=e1)
{
sort(&s1,&e1);
}
if(s2!=e2)
{
sort(&s2,&e2);
}
e1->next=s2;
s2->prev=e1;
*arg_s=s1;
*arg_e=e2;
}
void trade(struct node **l, struct node **r,struct node **s , struct node **e)
{
struct node *start,*end,*left,*right;
start = *s;
end =*e;
left =*l;
right =*r;
if(left == start)
{
start = right;
}
else
{
left->prev->next = right;
}
if(right == end)
{
end = left;
}
else
{
right->next->prev = left;
}
left->next->prev = right;
swap(&left->next, &right->next);
right->prev->next = left;
swap(&left->prev, &right->prev);
swap(&left, &right);
*l=left;
*r=right;
*s=start;
*e=end;
}
void swap(struct node **left, struct node **right)
{
struct node *tmp;
tmp = *left;
*left = *right;
*right = tmp;
}