Завершение рекурсивной функции в C

96
10

int postOrder(struct node* root, char organ[], char bt[], int* val){

if(root != NULL) {
postOrder(root->left, organ, bt, val);
postOrder(root->right, organ, bt, val);
if(strcmp(root->organ.organname, organ) == 0){
if(strcmp(root->organ.bloodtype, bt) == 0){
if(val == 0){
printf("%s\n", root->organ.name);
val = 1;
}
}
}
}
}

Я пытаюсь завершить эту рекурсивную функцию сразу после первой печати. Первоначально моя идея заключалась в том, чтобы передать десятичный указатель "val" и установить его в 1, когда я хотел закончить функцию. Мыслительный процесс заключается в изменении значения вне функции, поэтому все предыдущие вызовы имели бы обновленный указатель, но я не думаю, что он работает в этой настройке.

Эта функция выполняет поиск Post Postly через двоичное дерево.

спросил(а) 2013-11-07T21:54:00+04:00 6 лет, 2 месяца назад
3
Решение
50

Поскольку в настоящее время ваша функция ничего не возвращает, вы можете изменить ее, чтобы вернуть 1 если она напечатала что-либо, и вернуть 0 если это не так. Таким образом вам не нужно будет передавать указатель val (который вы все равно не используете правильно).

int postOrder(struct node* root, char organ[], char bt[]){
if(root == NULL) return 0;
if (postOrder(root->left, organ, bt, val)) return 1;
if (postOrder(root->right, organ, bt, val)) return 1;
if (strcmp(root->organ.organname, organ) == 0 && strcmp(root->organ.bloodtype, bt) == 0) {
printf("%s\n", root->organ.name);
return 1;
}
return 0;
}

ответил(а) 2013-11-07T22:01:00+04:00 6 лет, 2 месяца назад
Еще 2 ответа
83

Используйте *val. val - это просто указатель. Вы хотите его значение.

ответил(а) 2013-11-07T21:56:00+04:00 6 лет, 2 месяца назад
34

val является указателем на целое число, поэтому вам нужно разыгрывать его при настройке или получении его значения.

Пытаться:

if(*val == 0) { *val = 1;... }

ответил(а) 2013-11-07T22:01:00+04:00 6 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема