Se devi modificare un puntatore tramite una funzione devi passare il suo puntatore.
Puoi farlo tramite "&" oppure dichiarano un doppio puntatore nella funzione "funzione(QueueL* elem)"
Effettuare i controlli sul valore di info non e' una grande idea: se front e rear hanno lo stesso valore ( ma sono due elementi distinti ) li gestisce come una Queue di un solo elemento.
Piuttosto usa NULL e fai i controlli sui puntatori, così il programma non potrà mai "sbagliare".
Stampare a video "info" quando chiami pop() senza salvarlo non ti permette di usare efficacemente il contenitore. Ad esempio puoi ritornarlo o passare a pop() una variabile predisposta.
"app" così creato cessa di esistere al termine della funzione. Dichiaralo come puntatore e allocalo, così non "sparisce"
Per non confondere la tua struttura con "queue" della Standart Template Library, l'ho rinominata "Queue"
Se hai usato il typedef per nominarla "QueueL", non capisco perchè scrivi "queue *elem"
Manca <stdlib.h> per usare "system()"
Tutte le correzioni da me PROPOSTE sono in questo codice
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct Q *QueueL;
//Creazione di una struttura di tipo Queue.
typedef struct Q
{
float info;
QueueL link;
}
Queue;
void print(Queue Testa,Queue Coda);
void Push (QueueL &front, QueueL &rear);
float Pop (QueueL &front, QueueL &rear);
main()
{
//Dichiarazione delle variabili testa(front) e coda(rear), che puntano al primo e all'ultimo elemento della Queue.
QueueL front, rear;
front= NULL;
rear= NULL;
char c;
//Inizio del ciclo do..while per la ripetizione delle operazioni sulla struttura queue.
do
{
//Decisione dell'operazione da attuare sulla Queue.
cout << "1. Inserimento " << endl << "2. Estrazione" << endl << "Selezionare operazione: ";
int option;
cin >> option;
switch(option)
{
case 1:
Push(front, rear);
break;
case 2:
cout << "\n\n Elemento estratto = " << Pop(front, rear) << endl << endl;
break;
}
//Decidere se continuare a lavorare sul programma oppure no.
if(front!=NULL && rear!=NULL) print(*front, *rear);
else cout << "\n\n Coda vuota!\n\n";
cout<<"Continuare (S/N)?";
cin>> c;
}
while (c=='s');
delete rear;
delete front;
system("PAUSE");
}
void print(Queue Testa,Queue Coda)
{
cout << "///////////////////////////////////////////////////" << endl;
cout<<"L'elemento di testa è: "<< Testa.info<<endl;
cout<<"L'elemento di coda è: "<< Coda.info <<endl;
cout << "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
}
void Push (QueueL &front, QueueL &rear)
{
// Creazione di un nuovo nodo (app) della Queue.
cout<<"Inserire nuovo valore: ";
QueueL app=new Queue;
cin>>app->info;
app->link= NULL;
//Se la Queue è vuota, poniamo il nodo come front e rear.
if (front==NULL)
{
cout << "\n\n<la coda e' vuota>\n\n";
front=rear=app;
print(*front,*rear);
}
//Se la Queue ha un solo elemento, il nuovo nodo diviene rear, e la front punta a questo.
else if (front==rear)
{
front->link=app;
rear=app;
print(*front, *rear);
}
//Altrimenti la rear punta al nuovo elemento, che diviene rear.
else
{
rear->link=app;
rear=app;
print(*front, *rear);
}
}
float Pop (QueueL &front, QueueL &rear)
{
//Estrazione valore di testa.
if(front==NULL){
cout<<"La coda è vuota!"<<endl;
return -1;
}
//Se la Queue non è vuota estraiamo il valore, divedendo i casi in cui vi sia un solo elemento o più di uno.
else
{
float el_estratto=front->info;
if (front==rear){
delete front;
front=rear=NULL;
}
else{
QueueL app=front->link;
delete front;
front=app;
}
return el_estratto;
}
}
PS: Dato che ho scoperto cos'è e come funziona una Queue circa 15 min fa per risponderti, forse ho sbagliato la sua logica ottenendo un'altro tipo di struttura. E' giusta così
Ciao