双方向リストクイックソート

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tsuna

双方向リストクイックソート

#1

投稿記事 by tsuna » 3年前

c言語で明日提出の課題があって困っています。
双方向リストのクイックソートで昇順したいのですが上手く行きません。
何となくはできるのですが所々できない所々があります。(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;
}

tsuna

Re: 双方向リストクイックソート

#2

投稿記事 by tsuna » 3年前

tsuna さんが書きました:
3年前
c言語で明日提出の課題があって困っています。
双方向リストのクイックソートで昇順したいのですが上手く行きません。
何となくはできるのですが所々できない所々があります。(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;
}

Meta3

Re: 双方向リストクイックソート

#3

投稿記事 by Meta3 » 3年前

コードが何回もかさねてコピペされてるのを正しくしましょう。

c1.c(3): fatal error C1083: include ファイルを開けません。'ex4.h':No such file or director

ex4.h ファイルも必要ですよ。

Meta3

Re: 双方向リストクイックソート

#4

投稿記事 by Meta3 » 3年前

エラーメッセージも提示してくださいね

返信

“C言語何でも質問掲示板” へ戻る