#c #if-statement #while-loop #flags
#c #if-оператор #цикл while #флаги
Вопрос:
У меня есть следующее, которое работает, но мне было интересно, есть ли лучший способ. Лучше означает более эффективный и / или более компактный.
Функция проверяет дерево, чтобы увидеть, есть ли слово в дереве.
bool check(const char *word)
{
int nodeIdx = hash(word);
if (nodeIdx < 0)return false;
nodeWords * searchNode;
searchNode = nodeArray[nodeIdx]; //nodeArray is global
bool whileFlag = true, returnFlag = false;
do
{
if (strcmp(word,searchNode->word) == 0 )
{
whileFlag = false;
returnFlag = true;
}
else if (strcmp(word,searchNode->word) < 0 )
{
if(searchNode->left == NULL)
{
whileFlag = false;
}else{
searchNode = searchNode->left;
}
}else{
if(searchNode->right == NULL)
{
whileFlag = false;
}else{
searchNode = searchNode->right;
}
}
}while (whileFlag);
free(searchNode);
return returnFlag;
}
например, мы могли бы переписать функцию таким образом:
bool check(const char *word)
{
int nodeIdx = hash(word);
if (nodeIdx < 0)return false;
nodeWords * searchNode;
searchNode = nodeArray[nodeIdx];
bool returnFlag = false;
do
{
if (strcmp(word,searchNode->word) == 0 )returnFlag = true;
else if (strcmp(word,searchNode->word) < 0 amp;amp; searchNode->left != NULL) searchNode = searchNode->left;
else if (strcmp(word,searchNode->word) > 0 amp;amp; searchNode->right != NULL) searchNode = searchNode->right;
}while (searchNode->left != NULL || searchNode->right != NULL || strcmp(word,searchNode->word) == 0);
return returnFlag;
}
Комментарии:
1. Вероятно, вы захотите задать этот вопрос при проверке кода .
2. Происходит утечка памяти. Вы выполняете
malloc
forsearchNode
, но немедленно заменяете егоnodeArray[nodeIdx]
выделенным значением, которое теряется3. Я проголосовал за то, чтобы закрыть это, поскольку требует большего внимания , поскольку оно выходит за рамки этого сайта; Кроме того, оно было отправлено в CR
4. @Blastfurnace Там все закрывается, спасибо, что увеличили нагрузку на всех участников, сделав неправильное перенаправление. Пожалуйста, ознакомьтесь с руководством по проверке кода для пользователей Stack Overflow , прежде чем делать это снова.