Посмотрите на вашу search
функцию:
void search(struct node *head, int key, int index)
{
while (head != NULL)
{
if (head->a == key)
{
printf("Key found at Position: %d\n", index);
}
search(head->next, key, index - 1);
}
}
Теперь пока игнорируйте два «действия», которые происходят в цикле while
, и просто подумайте о том, что останавливает выполнение цикла,Предполагая (при самом первом вызове функции), что значение head
равно , а не NULL
, когда цикл остановится? Конечно, когда head
становится NULL
- но вы никогда не измените значение head
в этом цикле! И рекурсивный вызов search
не меняет его в функции, которая в данный момент выполняется! Так что это бесконечный цикл.
Вам нужно назначить head->next
на head
внутри цикла, например:
void search(struct node *head, int key, int index)
{
while (head != NULL)
{
if (head->a == key)
{
printf("Key found at Position: %d\n", index);
}
head = head->next; // If list is properly formed, this will get to NULL
search(head, key, index - 1); // Now we don't need to use the ->next here
}
}
Кроме того, если вы хотите найти только первое вхождение ключа, вы можете добавить оператор return
после printf
;в существующем состоянии вы распечатаете все совпадений - но этого может потребоваться, если вы захотите.