2017-12-28 38 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 int ARRAY [MAX]; 및 상기 MAX 값의 정의.

주에서는 ARRAY t를 임의의 값으로 채운 다음이 함수를 다음과 같이 호출합니다. searchTreeSort (t, max);

정렬 전후에 내 ARRAY를 표시 할 때를 제외하고는 아무 것도 변경되지 않았습니다. 요소는 동일한 순서로있었습니다.

displayAllNodes 함수는 Tree가 올바르게 생성되었다는 것을 보여주었습니다. 올바른 순서로 요소를 배열에 다시 저장하는 마지막 단계입니다.

이미 스레드와 같은 해결책을 보았습니다. C binary tree sort - extending it 하지만 typedef int ARRAY [MAX];를 사용해야합니다. 그런 포인터를 사용하는 동안 더 많은 포인터 집중적 인 솔루션을 구현하는 방법을 모릅니다.

어디에서 문제가 발생했는지 확인할 수 있도록 도와 주시겠습니까? 미리 감사드립니다.

답변

1

글쎄 그것은 어긋나 야합니다. 값을 전달한 값 i이 전달됩니다. 하나의 함수에서 증가시킵니다. 그러나 그것은 어쨌든 동일한 기능에 대한 다른 호출을 반영하지는 않습니다. 이미 쓰여진 값을 덮어 쓰는 중입니다. 그래서 해결책은 무엇입니까? 충분히 간단합니다. 변수의 주소를 전달하십시오.

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