Turni - loop infinito

Qualcuno che mi da’ una dritta su come risolvere questo problema.
Il codice va in loop infinito nei due while annidati in fondo.

grazie

#include<stdio.h>
#include<stdlib.h>

typedef struct {int inizio; int fine;}Persona;

Persona p[50];

int cmp(void* a, void* b)
{
    Persona c=*((Persona*)a);
    Persona d=*((Persona*)b);
    
    if(c.inizio==d.inizio)
        return 0;
    else
    {
        if(c.inizio>d.inizio)
            return 1;
        else
            return -1;
    }
}



int chiInizia()
{
    int inizia=0;
    int i=0;
    int fine=0;
    while(p[i].inizio==0)
    {
        if(p[i].fine>fine)
        {
            fine=p[i].fine;
            inizia=i;
        }
        i++;
    }
    return inizia;
}

main()
{
    freopen("input.txt", "r", stdin); 
    freopen("output.txt", "w", stdout);
    int i;
    int giorni;
    scanf("%d", &giorni);
    int n;
    scanf("%d", &n);
    for(i=0; i<n; i++)
    {
        scanf("%d", &(p[i].inizio));
        scanf("%d", &(p[i].fine));
    }
    
    qsort(p, n, sizeof(Persona), cmp);
    
    int max=1;
    int attuale=chiInizia();
    i=attuale+1;
    
    while((p[attuale].fine)<giorni)
    {
        while((p[i].inizio)<(p[attuale].fine))
        {
        	i++;
		}
        attuale=i-1;
        max++;
    }
    
    printf("%d", max);
    
}

Ciao, solitamente in questi casi si usa una tecnica chiamata “stampa variabili a caso”.
Io per esempio scrivo:

#define print(var) fprintf(stderr,"%s: %d\n",#var,var)

Poi puoi chiamare la funzione all’interno del ciclo dove si blocca:

while((p[attuale].fine)<giorni)
{
    ...
    print(i);
    print(attuale);
}

Facendo così puoi vedere i valori che assumono le variabili e capire perché continua a ciclare all’infinito.

2 Mi Piace