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;