Это выглядит неправильно:
tail->next=temp;
tail=temp;
tail->next=head;
temp->next=head;
Так и должно быть (если вы добавляете новый узел в конец списка и хотите, чтобы он был круговым списком, как я предполагаю здесь):
tail->next=temp;
temp->next=head;
tail=temp;
В любом случае, это небольшая ошибка: только избыточное назначение.
Здесь действительно серьезные проблемы:
void findcycle()
{
if (head == NULL || head->next == NULL)
printf("null");
sp=head;
fp=head->next;
while (fp != NULL && fp->next != NULL)
{
if ((fp == sp) || (fp->next == sp))
printf("Cycle");
sp = sp->next;
fp = fp->next->next;
}
printf("Not a Cycle");
}
Прежде всего, каковыты пытаешься сделать?Это не ясно, поэтому нелегко предложить вам, как это исправить;во всяком случае, наиболее очевидная ошибка заключается в том, что если список на самом деле является круглым, то цикл будет продолжаться вечно, поскольку не может быть никакого условия выхода (ни один из указателей никогда не будетNULL).