Problema en cola circular fifo

aldaris
17 de Mayo del 2004
Saludos, soy estudiante de primero de ASI y tengo algunos problemillas con una cola circular.

Llevo varias horas intentado encontrar el problema y no soy capaz de verlo. El programa es para consola, en c++. Debe salir en pantalla una lista de los datos que hay en la cola, éstos se van llenando con un random de 100 para obtener un numero entre 0 y 99.

*pp: es el puntero primero, es inamovible y marca la posición de memoria del inicio de la cola
*pa: es el puntero para añadir el próximo dato, apunta al sigiuente espacio vacio.
*pf: es el puntero final, es inamovible y apunta al final de la cola circular.
*ps: es el puntero que apunta al dato que debe salir de la cola.
*pt: es un puntero temporal que recorrerá la cola desde "ps" hasta "pa" para poder listarla en pantalla.

El programa parece que funciona correctamente, pero cuando saca un par de elementos de la cola entra en un bucle infinito (El que tengo para listar "for", y de ahí no sale), se salta incluso el gotoxy, no lo entiendo. Es algo extraño.

Si alguien me puede echar una mano le estaré muy agradecido :)

Ahí va el codigo fuente completo:

void main()
{ randomize();
_setcursortype(_NOCURSOR);
int *pp,*pa,*pf,*pt,*ps;
int c,ne;

clrscr();
gotoxy(2,2);
printf("Elementos de la cola: ");
scanf("%d",&ne);
clrscr();

gotoxy(2,2);
printf("Cola circular de %d elementos",ne);

pp=new int[ne+1];
pa=ps=pt=pp;
pf=pp+(ne);

do
{ if(random(6)==0) //queremos sacar dato
{ if(ps==pa) //la cola está vacía
{ gotoxy(40,2);
printf("Cola vacia");
}else{ //podemos sacar, hay datos en la cola
ps++;
if(ps>pf) ps=pp;
}

}else{ //queremos insertar dato

if((ps==pp && pa==pf)||(ps-1==pa)) //la cola está llena
{ gotoxy(40,2);
printf("Cola llena");
}else{ //podemos insertar, hay sitio en la cola
*pa=random(100);
pa++;
if(pa>pf && ps>pp) pa=pp;
if(pa>pf && ps==pp) pa--;

}
} //cierre del else de inserción de dato

c=5;
for(pt=ps;pt!=pa;pt++) //listado de la cola en pantalla
{ if(pt>pf) pt=pp;
gotoxy(2,c);
printf("%2d",*pt);
c++;
}

sleep(1);
clrscr();
gotoxy(2,2);
printf("Cola circular de %d elementos",ne);

}while(!kbhit());

}

quique
17 de Mayo del 2004
Oye,
lo que yo veo es que hasta que no pulses una tecla, se va a quedar en el do-while "infinitamente"....

Otra cosa: falta un delete al final

Salu2