リンクリスト構造の再帰ソートアルゴリズムを実装しようとしています。 C言語。 1))リスト 2で最大値を見つけ、リストから削除し、次のノード 4から再びヘッドノード 3)アルゴリズムを開始する時にそれを挿入)を使用すると、リストの最後に到達するまで実行します。C:リンクリストの再帰的ソート
私のアルゴリズムはこれです
私は何かを持っていますが、私のリストを覚えていません。私はどこかでミスを犯していることを知っています(おそらく再帰呼び出し)が、それを修正する方法を理解することはできません。
typedef struct Node{
int data;
struct Node* next;
} Node;
void insert(Node** head, int val)
{
//insert at top
Node* to_insert = (Node*)malloc(sizeof(Node));
to_insert->data = val;
to_insert->next = (*head);
(*head) = to_insert;
}
Node* sort_ll(Node* head)
{
//base case, iterated trough entire list
if(head == NULL)
return NULL;
int max = 0;
Node* tmp = head;
Node* to_move = tmp;
//find maximum value
while(tmp != NULL) {
if(tmp->data > max) {
max = tmp->data;
to_move = tmp;
}
tmp = tmp->next;
}
//if its currently top, leave it there
if(to_move == head) {
return sort_ll(head->next);
}
//find node with max value
tmp = head;
while(tmp->next != to_move) {
tmp = tmp->next;
}
//cut it out from the list
tmp->next = tmp->next->next;
free(to_move);
//insert value at the head of the list
insert(&head, max);
return sort_ll(head->next);
}
int main()
{
Node* list = NULL;
insert(&list, 3);
insert(&list, 6);
insert(&list, 7);
insert(&list, 2);
insert(&list, 1);
insert(&list, 5);
insert(&list, 4);
list = sort_ll(list);
Node* tmp = list;
while(tmp != NULL) {
printf("%d\n", tmp->data);
tmp = tmp->next;
}
return 0;
}
のような 'sort_ll'関数は' head'(間接的に)変更していますが、 "参照渡し" をエミュレートしません。関数が 'Node *'を返すので、あなたはそれを行うと仮定しますが、問題は 'sort_ll'が常に' NULL'を返すということです。デバッガを使用し、行ごとにコードをステップ実行します。 –
@Someprogrammerdude私はこのシグネチャ 'Node * sort_ll(Node ** head)を試していましたが、より良い結果は得られませんでした。あなたはさらに説明できますか?または例を挙げてください。 – Rorschach
'sort_ll'に3つのreturn文があります。 1つは 'return NULL;'であり、残りの2つは 'return sort_ll(...);'これはどのようにして非NULLを返すことができますか? –