edutecnica

Esercizio 8       

Basandosi sull'algoritmo della lista a puntatori, realizzare una coda di interi che preveda una funzione di push per inserire un nuovo elemento, una funzione pop per estrarre il primo elemento inserito e una funzione print per stampare la coda.


#include<iostream>
using namespace std;

/*definisco la struttura record */
struct T {
      int x;
      T* y;
};
//anche stavolta definiamo i prototipi
void push(T *j);
T *pop(T *j);
// pop restituisce un puntatore all'inizio della coda

void print(T *j);

main() {
T *j;//primo
j->x=0;j->y=NULL;//iniz.lista vuota
int ch;
do{
     ch=0;
     cout<<"1]inserisci\n";
     cout<<"2]togli\n";
     cout<<"0]exit\n";
     cin>>ch;
     switch(ch) {
          case 1:push(j);print(j);break;
          case 2:j=pop(j);print(j);;break;
          case 0:cout<<"EXIT";break;
          default:cout<<"-non valido-";break;
     }//end switch
}while(ch);
}//fine main

void push(T *j){
int n;
cout<<"ins:";
if((cin>>n).good())
     if(!j->x && j->y==NULL)j->x=n;//se è il primo
     else{
          T *p = new T;
          p->x = n;
          p->y = NULL;
          T *q =j;
          while(q->y!=NULL)q= q->y;//scansione
          q->y=p;
     }//fine if(!j->x && j->y==NULL)
}//fine push

/* funzione pop */
T *pop(T *j){
if(!j->x && j->y==NULL){
cout<<"vuota\n";
return j;
} //se c'è un solo elemento e lo tolgo
else{
if(j->x && j->y==NULL){
     j->x=0;
     cout<<"vuota\n";
     return j;
}//se c'è più di un elemento
     else return j->y;
}
}//fine pop

void print(T *j) {
T* p= j;
while(p != NULL) {
     cout<<p->x<<" ";
     p = p->y;
}//fine while
cout<<endl;
}//fine print

In questo caso, il lavoro fatto dalla funzione di estrazione pop() è semplice.
Se la coda è vuota pop non deve fare niente.
Se la coda contiene un solo elemento, quell'elemento deve essere posto a 0, con l'istruzione:
if(j->x && j->y==NULL){
     j->x=0;
     cout<<"vuota\n";
     return j;
}

     =>      

Se la coda contiene più di un elemento la funzione ritorna un puntatore all'elemento successivi al primo:

return j->y;