edutecnica

Esercizio 7       

Scrivi un programma per realizzare una lista di interi inseriti da tastiera, l'inserimento deve essere effettuato da una funzione (push) che inserisce un elemento in fondo alla lista. Il programma deve prevedere la presenza di una funzione (pop) che toglie un elemento scelto dall' dall'utente, presente nella lista, la stessa funzione si occuperà di riorganizzare la struttura dopo tale operazione.


#include<iostream>
using namespace std;

/*definisco la struttura record */
struct T {
      int x;
      T* y;
};
void push(T *j);//stavolta definiamo i prototipi
void pop(T *j);
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: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

void pop(T *j){
if(!j->x && j->y==NULL)cout<<"vuota\n";
else{
     T *p =j;
     if(p->y==NULL)p->x=0;
     else {
     while((p->y)->y!=NULL)
     p=p->y;
     p->y=NULL;
     }
}
}//fine pop

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

La funzione di push ripete il meccanismo di inserimento già vista nella parte teorica per la lista a puntatori. Il main() inizializza la pila creando un elemento che contiene 0 e punta a NULL.

La funzione pop deve replicare il meccanismo della pila (first in first out). Se la pila non è vuota:

allora il primo elemento contiene un numero diverso da 0. In tal caso, dopo che il puntatore p è stato fatto puntare al primo elemento, viene eseguita l'operazione:
if(p->y==NULL)p->x=0;
e la pila torna in condizione iniziale cioè vuota.

Se vi è più di un elemento viene eseguito il task:
while((p->y)->y!=NULL)p=p->y;
p->y=NULL;

il puntatore p cammina fino al penultimo elemento; poi l'elemento cui punta p viene fatto puntare a NULL.