2017-12-28 40 views
1

Cでツリーソートを実現する必要がありますが、できるだけ古典的なアルゴリズムにもかかわらず動作させることができませんでした。ここに私のコードは次のとおりです。ツリー並べ替え中に配列が並べ替えられない

searchTreeSort.h:

#ifndef UTILS_H 
#define UTILS_H 

#include "utils.h" 

#endif 


//Déclaration d'une structure représentant un noeud d'arbre 
struct _node; 
typedef struct _node NODE; 

typedef NODE *TREE; 

TREE newNode(int item); 
TREE insert(TREE node, int key); 
void storeInOrder(TREE root, ARRAY t, int i); 
void freeAllNodes(TREE root); 
void displayNodes(TREE root); 
void searchTreeSort(ARRAY t, int max); 

searchTreeSort.c:utils.hで

#include "searchTreeSort.h" 

struct _node{ 
    int value; 
    TREE left; 
    TREE right; 
}; 

TREE newNode(int item){ 
    TREE t = malloc(sizeof(NODE)); 
    t->value = item; 
    t->left = NULL; 
    t->right = NULL; 
    return t; 
} 

TREE insert(TREE root, int item){ 
    if(root == NULL) 
     return newNode(item); 

    if(item < root->value){ 
     root->left = insert(root->left, item); 
    } 
    else if(item > root->value){ 
     root->right = insert(root->right, item); 
    } 

    return root; 
} 

void storeInOrder(TREE root, ARRAY t, int i){ 
    if(root != NULL){ 
     storeInOrder(root->left, t, i); 
     t[i++] = root->value; 
     storeInOrder(root->right, t, i); 
    } 
} 

void freeAllNodes(TREE root){ 
    if(root != NULL){ 
     freeAllNodes(root->left); 
     freeAllNodes(root->right); 
     free(root); 
    } 
} 

void displayNodes(TREE root){ 
    if(root != NULL){ 
     displayNodes(root->left); 
     displayNodes(root->right); 
     printf("%d\n", root->value); 
    } 
} 

void searchTreeSort(ARRAY t, int max){ 
    TREE root = NULL; 
    root = insert(root, t[0]); 
    for(int i = 1; i < max; i++){ 
     insert(root, t[i]); 
    } 

    int i = 0; 
    storeInOrder(root, t, i); 
    //displayNodes(root); 
    freeAllNodes(root); 
} 

、私は次のtypedefがあります。 typedef int ARRAY [MAX];前記MAX値の定義とを含む。

メインでは、ARRAY tにランダムな値を設定し、次にこのように関数を呼び出します。searchTreeSort(t、max);

並べ替えの前後にARRAYを表示した場合を除いて、何も変更されていませんでした:要素は同じ順序にとどまりました。

displayAllNodes関数は、ツリーが正しく作成されたことを示していました。これは、要素が正しい順序で配列に戻ってきて、間違っていると思われる最後のステップです。

私は既にこのようなスレッドでいくつかの解決策を見ています:C binary tree sort - extending it しかし、私はtypedef int ARRAY [MAX];を使用する必要があります。それを使用している間、ポインタの集中ソリューションを実装する方法を知らない。

問題の原因が特定できたら教えてください。 ありがとうございます。

答えて

1

これはうんざりです。あなたが渡した値iは値渡しです。 1つの機能でそれを増やします。しかし、それはとにかく同じ機能に対する他の呼び出しを反映することにはなりません。既に書き込まれた値を上書きしています。だから、解決策は何ですか?十分に簡単です。変数のアドレスを渡します。

void storeInOrder(TREE root, ARRAY t, int* i){ 
    if(root != NULL){ 
     storeInOrder(root->left, t, i); 
     t[(*i)++] = root->value; 
     storeInOrder(root->right, t,i); 
    } 
} 

そして、あなたはそれが働い宣言

void storeInOrder(TREE root, ARRAY t, int* i); 
+0

を変更するヘッダファイルでこの

storeInOrder(root, t, &i); ^^^ passing the address. 

のようにそれを呼び出します。私はポインタを使って作業しなければならない時にはいつも物事を混乱させます。どうもありがとう。 – Meleadeles

関連する問題