我必须在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:
#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);
}
在utils.h中,我有以下typedef:typedef int ARRAY [MAX];和所述MAX值的定义。
在main中,我用随机值填充我的ARRAY t,然后像这样调用我的函数:searchTreeSort(t,max);
除了当我在排序前后显示我的ARRAY时,绝对没有任何改变:元素保持相同的顺序。
函数displayAllNodes向我展示了树是正确创建的,这是将元素以正确的顺序存储在数组中的最后一步,似乎出错了。
我已经在这样的线程上看到了一些解决方案:C binary tree sort - extending it 但我必须使用typedef int ARRAY [MAX];并且在使用它时不知道如何实现那些更多指针密集型解决方案。
您能帮我确定问题的来源吗? 提前谢谢。
答案 0 :(得分: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);
}
}
你称之为
storeInOrder(root, t, &i);
^^^ passing the address.
在头文件中更改声明
void storeInOrder(TREE root, ARRAY t, int* i);