Я пытаюсь понять код C, написанный для обнаружения и удаления цикла в связанном списке (взято из здесь ).Хотя все остальное имеет для меня смысл, я не могу понять, что происходит внутри оператора while
.В частности, как логическое И ведет себя при применении к структурам указателей?
while (slow_p && fast_p && fast_p->next)
Здесь использовался подход «заяц и черепаха», в котором мы используем два указателя, один быстрый и один медленный,
/* Link list node */
struct Node
{
int data;
struct Node* next;
};
/* Function to remove loop. Used by detectAndRemoveLoop() */
void removeLoop(struct Node *, struct Node *);
/* This function detects and removes loop in the list
If loop was there in the list then it returns 1,
otherwise returns 0 */
int detectAndRemoveLoop(struct Node *list)
{
struct Node *slow_p = list, *fast_p = list;
while (slow_p && fast_p && fast_p->next)
{
slow_p = slow_p->next;
fast_p = fast_p->next->next;
/* If slow_p and fast_p meet at some point then there
is a loop */
if (slow_p == fast_p)
{
removeLoop(slow_p, list);
/* Return 1 to indicate that loop is found */
return 1;
}
}
/* Return 0 to indeciate that ther is no loop*/
return 0;
}