※ ChatGPTを利用し、要約された質問です(原文:C言語のリストのソートについて質問します。)
C言語のリストのソートについて質問します
C言語のリストのソートについて質問します。
こんばんは、aida13です。以前の質問が自己解決しました。回答者のみなさん本当にすみませんでした。
今回はそのアルゴリズムで改善したい点がありましたので投稿させていただきました。以下のソートを実行するとソート自体はうまくいくのですが、見ての通りwhileやifなどを使って何度も実行しなおさないと完全にソートできません(「5 4 3 2 1」→「4 3 2 1 5」(一回ソート))。これを一回でソートできるようにしたいのです。また、降順も同様にそのままsecondとheadを入れ替えたのですが…今度は何度やっても「1 2 3 4 5」→「2 1 3 4 5」(一回ソート)からそれ以上動きません。アドバイスをお願いします。また、出来る限りこの形を保てる形でお願いします。
以下自作ソート
#include < stdio.h >
#include < stdlib.h >
struct ans
{
int data;
struct ans *next;
};
struct ans *sort_up(struct ans *head)
{
int temp;
struct ans *second_head;
second_head = (struct ans *)malloc(sizeof(struct ans));
second_head = head->next;
if( head->next == NULL )
{
return head;
}
else
{
if( head->data > second_head->data )
{
temp = head->data;
head->data = second_head->data;
second_head->data = temp;
sort_up(head->next);
}
else
{
sort_up(head->next);
}
return head;
}
}
struct ans *add_list(int x, struct ans *head)
{
struct ans *new_head;
new_head = (struct ans *)malloc(sizeof(struct ans));
new_head->data = x;
new_head->next = head;
return new_head;
}
void show_list(struct ans *head)
{
if( head == NULL )
{
printf("\n\n");
}
else
{
printf("%d ",head->data);
show_list(head->next);
}
}
void main()
{
struct ans *head;
head = NULL;
head = add_list(1,head);
head = add_list(2,head);
head = add_list(3,head);
head = add_list(4,head);
head = add_list(5,head);
do
{
printf("input:");
scanf("%d",&a);
if(a==0)
{
head = sort_up(head);
show_list(head);
}
}
while(a==0);
}
お礼
ありがとうございます。やはり双方向リストを使わなければ無理なようですね。勉強して再チャレンジしてみたいと思います。