2016-11-23 14 views
1

リンクリスト構造の再帰ソートアルゴリズムを実装しようとしています。 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; 
} 
+0

のような 'sort_ll'関数は' head'(間接的に)変更していますが、 "参照渡し" をエミュレートしません。関数が 'Node *'を返すので、あなたはそれを行うと仮定しますが、問題は 'sort_ll'が常に' NULL'を返すということです。デバッガを使用し、行ごとにコードをステップ実行します。 –

+0

@Someprogrammerdude私はこのシグネチャ 'Node * sort_ll(Node ** head)を試していましたが、より良い結果は得られませんでした。あなたはさらに説明できますか?または例を挙げてください。 – Rorschach

+3

'sort_ll'に3つのreturn文があります。 1つは 'return NULL;'であり、残りの2つは 'return sort_ll(...);'これはどのようにして非NULLを返すことができますか? –

答えて

2

修正この

Node *sort_ll(Node* head){ 
    if(head == NULL || head->next == NULL) 
     return head;//There is no need for processing 

    int max = head->data; 
    Node *prev = head; 
    Node *to_move = NULL; 
    Node *tmp = head->next; 

    //find maximum value in rest(head->next) 
    while(tmp != NULL) { 
     if(tmp->data > max) { 
      max = tmp->data; 
      to_move = prev;//save previous node for remove link 
     } 
     prev = tmp; 
     tmp = tmp->next; 
    } 

    if(to_move == NULL) {//not find in rest 
     head->next = sort_ll(head->next); 
     return head; 
    } 

    prev = to_move; 
    to_move = prev->next;//max node 
    prev->next = prev->next->next;//max node remove from link 
    to_move->next = sort_ll(head); 
    return to_move; 
} 
+0

魅力的な作品!どうもありがとう!私はこの最後の部分が私を混乱させ、 'to_move'ノードを返すものと思っています...もう一度ありがとう! – Rorschach

+0

max_node-> next = sort(残りのunsorted_list);戻り値max_node; – BLUEPIXY

関連する問題