Может кто-нибудь помочь мне найти, почему эта программа C работает на VS2005, но не на DEV-C ++ - PullRequest
2 голосов
/ 05 мая 2010

У меня есть программа на C для упражнения, и у нее странная проблема Программа отлично работает на VS 2005, но происходит сбой на DEV-C ++, и проблема в том, что упражнение всегда оценивается на соответствие DEV-C ++

Программа предназначена для вставки узлов в BST, и в этом проблема ... Ну, я был бы очень признателен за помощь.

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef struct tree_node   
{
int value;
int weight;
struct tree_node *left; 
struct tree_node *right; 
} TREE_NODE;
   TREE_NODE *create_tree(int list[], int size);
TREE_NODE *search_pos_to_insert(TREE_NODE *root, int value, int *left_or_right);    
//     this is the problematic function */
void inorder(TREE_NODE *root); /* Inorder Traversing */
TREE_NODE *temp;
int main()
{
TREE_NODE *root; /* Pointer to the root of the BST */
int values[] = {10, 5, 3, 4, 1, 9, 6, 7, 8, 2}; /* Values for BST */
int size = 10, tree_weight;

root = create_tree(values, 10);
printf("\n");

inorder(root); /* Inorder BST*/
system("PAUSE");
}


TREE_NODE *search_pos_to_insert(TREE_NODE *root, int value, int *left_or_right)
{
if(root !=NULL)
{
temp = root;
if(value >root->value)
{
    *left_or_right=1;
    *search_pos_to_insert(root->right, value, left_or_right);   
}
else
{
    *left_or_right=0;
    *search_pos_to_insert(root->left, value, left_or_right);
}
}
else

return temp;/* THIS IS THE PROBLEM (1) */


}
TREE_NODE *create_tree(int list[], int size)
{
TREE_NODE *new_node_pntr, *insert_point, *root = NULL;
int i, left_or_right;

/* First Value of the Array is the root of the BST */
new_node_pntr = (TREE_NODE *) malloc(sizeof(TREE_NODE));
new_node_pntr->value = list[0]; 
new_node_pntr->weight = 0;
new_node_pntr->left = NULL;
new_node_pntr->right = NULL;
root = new_node_pntr; 
/* Now the rest of the arrat. */
for (i = 1; i < size; i++)
{
/* THIS IS THE PROBLEM (2) */

    insert_point = search_pos_to_insert(root, list[i], &left_or_right); 

    /* insert_point just won't get the return from temp */
    new_node_pntr = (TREE_NODE *) malloc(sizeof(TREE_NODE));
    new_node_pntr->value = list[i];
    new_node_pntr->weight = 0;
    new_node_pntr->left = NULL;
    new_node_pntr->right = NULL;
    if (left_or_right == 0)
        insert_point->left = new_node_pntr;
    else
        insert_point->right = new_node_pntr;
}
return(root);
}


void inorder(TREE_NODE *root)
{
if (root == NULL)
    return;
inorder(root->left);
printf("Value: %d, Weight: %d.\n", root->value, root->weight);
inorder(root->right);
}

Ответы [ 4 ]

1 голос
/ 05 мая 2010

Ваш search_pos_to_insert ничего не возвращает в первом разделе, где root не равно NULL. Он рекурсивно вызывает функцию, но не собирает результат. Вам нужно возвращать все, что возвращают ваши рекурсивные вызовы, чтобы гарантировать правильность.

Вы должны изменить звонки

*search_pos_to_insert(root->right, value, left_or_right);
...
*search_pos_to_insert(root->left, value, left_or_right);

до

return search_pos_to_insert(root->right, value, left_or_right);
...
return search_pos_to_insert(root->left, value, left_or_right); 
0 голосов
/ 06 мая 2010

откровенный твой мужчина .. В какой-то момент я подумал, что, возможно, я смогу вернуть саму функцию, но я был почти уверен, что она не сработает, а также я пошел по другому пути (к left_or_right), и я был полностью потерян Ну, вы спасли от большого количества гнева, и вы действительно спасли мой день (вероятно, намного больше)

0 голосов
/ 05 мая 2010

В вашей функции TREE_NODE *search_pos_to_insert() у вас есть пути кода, которые не возвращают значение. Ваш компилятор должен выдать предупреждение об этом.

Линия:

return temp;/* THIS IS THE PROBLEM (1) */

достигается только в том случае, если if(root != NULL) имеет значение true.

Заменить рекурсивные вызовы на:

return search_pos_to_insert(root->right, value, left_or_right);
return search_pos_to_insert(root->left, value, left_or_right); 

чтобы заставить его работать.

0 голосов
/ 05 мая 2010

Хотя я не углубился во многие проблемы, вы уверены, что вы используете «временную» как глобальную здесь правильно? Разве он не должен быть локальным для функции поиска, поэтому функция реентерабельна?

...