Advertisement
LiMIllusion

Untitled

Jan 10th, 2017
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.66 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. //dichiarazione della struttura nodo
  5. struct nodo{
  6.   int inf;
  7.   struct nodo *next;
  8. };
  9. int h=0;
  10.  
  11.  
  12. //Funzione per la creazione della lista
  13. void *crealista(nodo*& testa1){
  14.   //dichiarazione del puntatore che verra' utilizzato per creare un nuovo nodo
  15.   struct nodo *p;
  16.   testa1=NULL;
  17.   //inizializzazione variabile per le risposte
  18.   char r;
  19.   //ciclo nel quale vengono letti i velori della lista
  20.   while(1) {
  21.     //creazione del noto
  22.     p= new nodo;
  23.     //assegnazione di un valore al campo 'inf' del nodo
  24.     std::cout << "Inserisci valore" << '\n';
  25.     std::cin >> p->inf;
  26.     //posizionamento dei puntatori
  27.     p->next=testa1;
  28.     testa1=p;
  29.     //ciclo nel quale viene effettuato un controllo per aggiungere o no un altro elemento
  30.     do {
  31.       std::cout << "Vuoi aggiungere un altro elemento?" << '\n'<<"s/n\n";
  32.       std::cin >> r;
  33.       if (r!='s'&&r!='S'&&r!='n'&&r!='N') {
  34.         std::cout << "Scelta non valida" << '\n';
  35.       }
  36.     } while(r!='s'&&r!='S'&&r!='n'&&r!='N');
  37.     if (r=='n'||r=='N'){
  38.             system("CLS");
  39.       break;
  40.     }
  41.   }
  42. }
  43.  
  44. //funzione per la stampa della lista
  45. void *stampalista(nodo*& testa1){
  46.   //dichiarazione puntatore che scorrera' la lista
  47.   struct nodo *p;
  48.   cout<<"\n";
  49.   //assegnazione a p del valore di testa. Ora p puntera' al primo valore della lista
  50.   p=testa1;
  51.   std::cout << "Lista: ";
  52.   //ciclo in cui si scorre la lista e si stampano gli elementi
  53.   while(1){
  54.     if (p->next==NULL) {
  55.       cout << p->inf << ".\n";
  56.       break;
  57.     }
  58.     else{
  59.       cout << p->inf << ", ";
  60.       p=p->next;
  61.     }
  62.   }
  63. }
  64.  
  65. //funzioni per l'aggiunta di elementi
  66. //funzione per l'aggiunta in testa
  67. void *aggiungit(nodo*& testa1) {
  68.   //dichiarazione puntatore
  69.   struct nodo *p;
  70.   //creazione del nuovo nodo
  71.   p= new nodo;
  72.   //assegnazione di un valore al campo 'inf' del nuovo nodo
  73.   std::cout << "Inserisci il valore del nuovo elemento: " ;
  74.   std::cin >> p->inf;
  75.   //posizionamento in testa del nuovo nodo
  76.   p->next=testa1;
  77.   testa1=p;
  78. }
  79.  
  80. //funzione per l'aggiunta in coda
  81. void *aggiungic(nodo*& testa1){
  82.   struct nodo *p,*q;
  83.   //assegnazione del valore di testa a p
  84.   p=testa1;
  85.   //si scorre la lista fino ad arrivare al penultimo elemento
  86.   while(p->next!=NULL){
  87.       p=p->next;
  88.     }
  89.     //si crea il nuovo nodo
  90.     q=new nodo;
  91.     //si assegna un valore al campo 'inf' del nuovo nodo
  92.     std::cout << "Inserisci il valore del nuovo elemento: ";
  93.     std::cin >> q->inf;
  94.     //si aggiunge il nuovo nodo in coda
  95.     q->next=NULL;
  96.     p->next=q;
  97. }
  98.  
  99. //funzione per l'aggiunta al centro
  100. void *aggiungin(nodo*& testa1) {
  101.   struct nodo *p,*q;
  102.   //inizializzazione variabili per confronti e conteggi
  103.   int x,y,c,z;
  104.   char scelta;
  105.   //lettura del valore da aggiungere
  106.   std::cout << "Inserisci il valore del nuovo elemento: ";
  107.   std::cin >> x;
  108.   //individuazione della posizione nella quale l'elemento va aggiunto
  109.   do{
  110.     std::cout << "Dopo quale valore della lista deve essere inserito?" << '\n';
  111.     stampalista(testa1);
  112.     std::cin >> y;
  113.     //controllo sull'esistenza della posizione richiesta
  114.     c=0;
  115.     p=testa1;
  116.     while(1){
  117.       if (p->next==NULL) {
  118.         if (p->inf==y) {
  119.           c=c+1;
  120.         }
  121.         break;
  122.       }
  123.       else{
  124.         if (p->inf==y) {
  125.           c=c+1;
  126.         }
  127.         p=p->next;
  128.       }
  129.     }
  130.     //in caso di presenza di piu' posizioni che rispettano le condizioni si procede in questo modo
  131.     if (c>1){
  132.       //viene scelto dove aggiungere
  133.       std::cout << "Sono stati individuati " << c << " valori pari a "<<y<< ". Inserire "<<x<<"\n";
  134.                     std::cout << "Dopo quale "<<y<<" deve essere inserito il numero?\n(1-"<<c<<")\n";
  135.      std::cin >> z;
  136.      p=testa1;
  137.      c=0;
  138.      while (1) {
  139.      if (p->inf==y) {    /*  questi                                                                          */
  140.      c++;             /*                                                                                  */
  141.      if (c==z) {     /*controlli si occupano di stabilire qual'e' la posizione corretta per il nuovo nodo*/
  142.             q=new nodo;
  143.             q->inf=x;
  144.             q->next=p->next;
  145.             p->next=q;
  146.        }
  147.      }
  148.      if (p->next==NULL) {
  149.            break;
  150.      }
  151.      p=p->next;
  152.  
  153.        }
  154.     }
  155.      else{
  156.       //se invece e' presente una sola posizione compatibile si procede alla creazione
  157.       if (c==1) {
  158.        p=testa1;
  159.        while (1) {
  160.            if (p->inf==y) {
  161.              q=new nodo;
  162.                 q->inf=x;
  163.                 q->next=p->next;
  164.                p->next=q;
  165.             }
  166.             if (p->next==NULL) {
  167.              break;
  168.            }
  169.            p=p->next;
  170.          }
  171.     }
  172.         //nel caso in cui non ci siano posizioni compatibili si restituisce un messaggio d'errore
  173.         else{
  174.           system("CLS");
  175.          std::cout << "Il valore scelto non esiste." << '\n';
  176.         }
  177.     }
  178.             }while(c==0);
  179.     system("CLS");
  180.  
  181. }
  182.  
  183.  
  184. //funzioni per l'eliminazione di elementi
  185. //funzione per l'eliminazione in testa
  186. void *eliminat(nodo*& testa1) {
  187.   struct nodo *p;
  188.   p=testa1;
  189.   p=p->next;
  190.   delete(testa1);
  191.   testa1=p;
  192. }
  193. //funzione per l'eliminazione in coda
  194. void *eliminac(nodo*& testa1) {
  195.   //creazione dei puntatori che scorreranno la lista
  196.   struct nodo *p,*q;
  197.   p=testa1;
  198.   q=p;
  199.   //in questo ciclo i puntatori si muovono esattamente uno dietro l'altro, per non perdere l'indirizzo del penultimo elemento e assegnargli valore NULL
  200.   while(p->next!=NULL){
  201.       q=p;
  202.       p=p->next;
  203.     }
  204.     q->next=NULL;
  205.     delete(p);
  206.   }
  207. //funzione per l'eliminazione al centro
  208. void *eliminan(nodo*& testa1) {
  209.   struct nodo *p,*q;
  210.   //variabili per il controllo degli elementi
  211.   int y,c,z;
  212.   char scelta;
  213.   //scelta del valore da eliminare
  214.   do{
  215.   std::cout << "Quale valore della lista deve essere rimosso?" << '\n';
  216.   stampalista(testa1);
  217.   std::cin >> y;
  218.   //si controlla che il valore da eliminare esista
  219.   c=0;
  220.   p=testa1;
  221.   while(1){
  222.     if (p->next==NULL) {
  223.       if (p->inf==y) {
  224.         c=c+1;
  225.       }
  226.       break;
  227.     }
  228.     else{
  229.       if (p->inf==y) {
  230.         c=c+1;
  231.       }
  232.       p=p->next;
  233.     }
  234.   }
  235.   //per quanto riguarda la possibilita' di nessuna, una o piu' posizioni compatibili, si procede come nell'aggiunta al centro
  236.   // in questi casi pero', i puntatori sono 2, uno dietro l'altro. il primo andrà a puntare il valore da eliminare, q servira' per puntare all'elemento successivo a p, mantenendo collegata la lista
  237.   if (c>1){
  238.     std::cout << "Sono stati individuati " << c << " valori pari a "<<y<< "\n";
  239.       std::cout << "Quale "<<y<<" deve essere eliminato?\n(1-"<<c<<")\n";
  240.       std::cin >> z;
  241.       p=testa1;
  242.       q=p;
  243.       c=0;
  244.       while (1) {
  245.         if (p->inf==y) {
  246.             c++;
  247.             if (c==z) {
  248.             q->next=p->next;
  249.             delete(p);
  250.             break;
  251.           }
  252.           }
  253.         }
  254.       q=p;
  255.       p=p->next;
  256.  
  257.                                                 }
  258.   else{
  259.     if (c==1) {
  260.       p=testa1;
  261.       q=p;
  262.       while (1) {
  263.           if (p->inf==y) {
  264.             q->next=p->next;
  265.             delete(p);
  266.             break;
  267.           }
  268.           q=p;
  269.           p=p->next;
  270.       }
  271.     }
  272.     else{
  273.       system("CLS");
  274.       std::cout << "Il valore scelto non esiste." << '\n';
  275.     }
  276.   }
  277.     }while(c==0);
  278.     system("CLS");
  279. }
  280.  
  281. //funzione per il calcolo delle occorrenze
  282. void *occorrenze(nodo*& testa1){
  283.         int k,c=0;
  284.         struct nodo *p;
  285.         cout<<"Inserisci l'elemento da cercare: ";
  286.         cin>>k;
  287.         p=testa1;
  288.         while(1){
  289.                 cout<<p->inf;
  290.                 if(p->inf==k){
  291.                     c++;
  292.                 }
  293.                 if(p->next==NULL){
  294.                     break;
  295.                 }
  296.                 p=p->next;
  297.         }
  298.         system("CLS");
  299.         cout<<"Il valore si ripete nella lista "<<c<<" volte\n";
  300. }
  301.  
  302. void *max(nodo*& testa1){
  303.             int max;
  304.         struct nodo *p;
  305.         p=testa1;
  306.         max=p->inf;
  307.         p=p->next;
  308.         while(1){
  309.                 cout<<p->inf;
  310.                 if(p->inf>max){
  311.                     max=p->inf;
  312.                 }
  313.                 if(p->next==NULL){
  314.                     break;
  315.                 }
  316.                 p=p->next;
  317.         }
  318.         system("CLS");
  319.         cout<<"Valore massimo della lista: "<<max;
  320. }
  321.  
  322. void *min(nodo*& testa1){
  323.             int min;
  324.         struct nodo *p;
  325.         p=testa1;
  326.         min=p->inf;
  327.         p=p->next;
  328.         while(1){
  329.                 cout<<p->inf;
  330.                 if(p->inf<min){
  331.                     min=p->inf;
  332.                 }
  333.                 if(p->next==NULL){
  334.                     break;
  335.                 }
  336.                 p=p->next;
  337.         }
  338.         system("CLS");
  339.         cout<<"Valore minimo della lista: "<<min;
  340. }
  341. //funzione principale
  342. int  main() {
  343.     //dichiarazione della testa della lista
  344.     struct nodo *testa;
  345.     if (h==0){
  346.         cout<<"Questo programma si occupa di eseguire delle funzioni su una lista di interi. Le funzioni disponibili sono: inserimento di un elemento, eliminazione di un elemento, conteggio delle occorrenze, individuazione di valore massimo e minimo.\n\n";
  347.     h++;
  348.         }
  349.         crealista(testa);
  350.   while (1) {
  351.     struct nodo *p;
  352.     stampalista(testa);
  353.     std::cout << "-Funzioni disponibili- \n";
  354.     std::cout << "\nFunzioni di inserimento: \n1) Inserimento elemento in coda \n2) Inserimento elemento in testa \n3) Inserimento elemento al centro \n";
  355.     std::cout << "\nFunzioni di eliminazione: \n4) Eliminazione elemento in coda \n5) Eliminazione elemento in testa \n6) Eliminazione elemento al centro \n";
  356.     std::cout << "\n\nFunzioni di conteggio occorrenze e individuazione valore massimo e minimo:\n7) Calcolo occorrenze\n8) Individuazione massimo\n9) Idividuazione minimo\n";
  357.                 std::cout << "\n\nr) Leggi nuova lista \n";
  358.     std::cout << "\n\nx) Chiudi \n";
  359.  
  360.     //controllo del numero di elementi nella lista, questo permetterà di evitare operazioni impossibili come l'eliminazione al centro, nel caso ci fosse solo un elemento nella lista
  361.     int c=0;
  362.     p=testa;
  363.       while (1) {
  364.         if (p->next==NULL) {
  365.             c++;
  366.             break;
  367.         }
  368.         else{
  369.           c++;
  370.           p=p->next;
  371.         }
  372.       }
  373.                 cout<<"Inserisci il simbolo della funzione da richiamare: ";
  374.     char scelta;
  375.     std::cin >> scelta;
  376.     //scelta della funzione da richiamare con il controllo sulla possibilita' di essere eseguita.
  377.     switch (scelta) {
  378.       case ('1'):
  379.           if (testa!=NULL) {
  380.             aggiungic(testa);
  381.             system("CLS");
  382.           }
  383.           else{
  384.             system("CLS");
  385.             std::cout << "Non e' possibile utilizzare questa funzione sulla lista corrente" << '\n';
  386.           }
  387.           break;
  388.       case ('2'):
  389.           if (testa!=NULL) {
  390.             aggiungit(testa);
  391.             system("CLS");
  392.           }
  393.           else{
  394.             system("CLS");
  395.             std::cout << "Non e' possibile utilizzare questa funzione sulla lista corrente" << '\n';
  396.           }
  397.           break;
  398.       case ('3'):
  399.       system("CLS");
  400.           if (testa!=NULL) {
  401.             aggiungin(testa);
  402.           }
  403.           else{
  404.             system("CLS");
  405.             std::cout << "Non e' possibile utilizzare questa funzione sulla lista corrente" << '\n';
  406.           }
  407.           break;
  408.       case ('4'):
  409.           if (c>1) {
  410.             eliminac(testa);
  411.             system("CLS");
  412.           }
  413.           else{
  414.             system("CLS");
  415.             std::cout << "Non e' possibile utilizzare questa funzione sulla lista corrente" << '\n';
  416.           }
  417.           break;
  418.  
  419.       case ('5'):
  420.           if (c>1) {
  421.             eliminat(testa);
  422.             system("CLS");
  423.           }
  424.           else{
  425.             system("CLS");
  426.             std::cout << "Non e' possibile utilizzare questa funzione sulla lista corrente" << '\n';
  427.           }
  428.           break;
  429.  
  430.       case ('6'):
  431.           if (c>2) {
  432.             eliminan(testa);
  433.           }
  434.           else{
  435.             system("CLS");
  436.             std::cout << "Non e' possibile utilizzare questa funzione sulla lista corrente" << '\n';
  437.           }
  438.           break;
  439.          
  440.       case ('7'):
  441.           if (c>=2) {
  442.             occorrenze(testa);
  443.           }
  444.           else{
  445.             system("CLS");
  446.             std::cout << "Non e' possibile utilizzare questa funzione sulla lista corrente" << '\n';
  447.           }
  448.           break;
  449.          
  450.       case ('8'):
  451.                     if (testa!=NULL){
  452.                             max(testa);
  453.                                         }
  454.           else{
  455.             system("CLS");
  456.             std::cout << "Non e' possibile utilizzare questa funzione sulla lista corrente" << '\n';
  457.           }
  458.           break;
  459.          
  460.       case ('9'):
  461.                     if (testa!=NULL){
  462.                             min(testa);
  463.                                         }
  464.           else{
  465.             system("CLS");
  466.             std::cout << "Non e' possibile utilizzare questa funzione sulla lista corrente" << '\n';
  467.           }
  468.           break;
  469.       case ('r'):
  470.           return main();
  471.       case ('x'):
  472.           return 0;
  473.       case ('R'):
  474.           return main();
  475.       case ('X'):
  476.           return 0;
  477.       default:
  478.           std::cout << "Scelta non valida" << '\n';
  479.     }
  480.   }
  481. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement