Doppia lista concatenata

di il
4 risposte

Doppia lista concatenata

Salve
non riesco a svolgere per esercitarmi questo vecchio esercizio sulle liste dato dal PoliMI.
La compilazione va in crash al punto 3 e non riesco a modificare.
GRAZIE
Il testo è questo:
State lavorando alla realizzazione di un applicativo per il monitoraggio di un ambiente di macchine virtuali ed è stato deciso di memorizzare i dati relativi ogni macchina virtuale in una lista dinamica. In particolare di ogni macchina viene richiesto di memorizzare una serie di informazioni: per semplicità ci limiteremo a considerare solo il nome , il numero di CPU, la quantità di memoria RAM (espressa in MB) e l'indirizzo IP della macchina fisica ospite.
Vi viene chiesto di realizzare, in linguaggio C++, le due seguenti funzioni:
- "aggiungiMV" che, ricevendo come parametri la lista delle macchine virtuali ed i dati di una nuova macchina virtuale, aggiunga tale macchina virtuale in coda alla lista;
- "selezionaPerNumeroCPU che, ricevendo come parametri la lista delle macchine virtuali ed un numero intero, restituisca la lista delle macchine virtuali aventi un numero di CPU pari o superiore al valore passato.
In particolare vi viene richiesto che gli elementi di questa seconda lista non siano un duplicato di quelli della prima ma dei puntatori ai dati in essa presenti (si veda a proposito l'esempio sottostante dove la funzione viene chiamata passando la lista che compare in alto ed ilvalore 2 e come risultato viene restituita la lista che compare in basso).
#include <iostream>
using namespace std;

const int DIM=15;

struct macchinaVirtuale
{
  char nome[DIM];
  int numCPU;
  int memRAM;
  int numIP; 
  struct macchinaVirtuale * next;    
};
struct Nodo
{
   struct macchinaVirtuale * prossimo;
   struct Nodo * successivo;      
};

//PROTOTIPI DI FUNZIONE********************************************************
struct macchinaVirtuale * aggiungiMV (struct macchinaVirtuale *);
void stampaLista(struct macchinaVirtuale * );
int menu();
struct Nodo * selezionaPerNumeroCPU(struct Nodo*, struct macchinaVirtuale *);
void stampaSecondaLista(struct Nodo * );


int main ()//*******************************************************************
{
 struct macchinaVirtuale * primo=NULL; //puntatore di testa (iniziale) che punta a NULL  (I lista)
 struct Nodo * testa=NULL; //puntatore di testa (iniziale) che punta a NULL (II lista)   
 int opz=menu();
 while (opz!=4)
 {
       switch (opz)
       {
       case 1:
            primo=aggiungiMV (primo);
            break;
       case 2:
            stampaLista(primo);
            break;
       case 3:
            testa= selezionaPerNumeroCPU (testa, primo);
            stampaSecondaLista (testa);
            break;       
       default:
            cout << "Errore"<<endl;
       }
   opz=menu();  
 }   
stampaLista(primo); 
    
system ("pause");
return 0;    
}

void stampaLista(struct macchinaVirtuale * testa)//*****************************
{
     struct macchinaVirtuale * corrente;
     corrente=testa;
     
          while (corrente != NULL)
          {
                cout << "Nome: "<<corrente-> nome<<"-->";    
                cout << "RAM: "<<corrente-> memRAM << " GB"<<"-->"; 
                cout << "Numero CPU: "<<corrente-> numCPU<<"-->";
                cout << "Numero IP: "<<corrente-> numIP<<endl;
                corrente=corrente->next;        
          }     
    cout << "Visualizzazione terminata"<<endl;
}

int menu()//********************************************************************
{
 int scelta;
 cout << "1 Inserire nuova macchina\n2 Stampa Lista\n3 Stampa Lista Macchine con 2 o piu' CPU\n4 Uscire \n?";cin >> scelta; 
 return scelta;   
}

struct macchinaVirtuale * aggiungiMV(struct macchinaVirtuale*primo)//************************************
{
 struct macchinaVirtuale * nuovo;
 nuovo = new macchinaVirtuale;//allocazione memoria
       nuovo->next=NULL;
       //popolo il nuovo elemento
       cout << "Inserire nome ";cin >> nuovo->nome;
       cout << "Inserire memoria RAM (in MB)";cin >> nuovo->memRAM;
       cout << "Inserire numero di CPU ";cin >> nuovo->numCPU;
       cout << "Inserire numero IP ";cin >> nuovo->numIP;
 if(primo==NULL)
     { primo=nuovo;
       return primo;
       }            
 else //inserimento in coda
      primo->next=nuovo; 
      return primo;
}

struct Nodo * selezionaPerNumeroCPU(struct Nodo* primoPunt, struct macchinaVirtuale * testa)//********************************
{
     struct macchinaVirtuale * nuovo;
     struct Nodo * altro;
       
     while(nuovo!=NULL)
     {
         if (nuovo->numCPU >= 2) 
         {
            //creazione nuovo nodo e allocazione memoria
            altro=new Nodo;
            altro->successivo=NULL; 
            
            if (primoPunt==NULL)//primo nodo
            {
               primoPunt=altro;
               altro->prossimo = nuovo;
               return primoPunt;
            }   
            else // ci sono già altri nodi  
            {
              primoPunt->successivo = altro;// inserimento in coda
              altro->prossimo=nuovo;  
              return primoPunt; 
            }            
         }
                       
         nuovo=nuovo->next;                  
     }       
}

void stampaSecondaLista(struct Nodo * primo)
{
     struct Nodo * corrente, * stampa;
     struct macchinaVirtuale * ausilio;
     corrente = primo;
     while(corrente != NULL)
     {
       stampa=corrente;
       cout << stampa->prossimo->nome << endl; 
       corrente=corrente->successivo;            
     }
     
    cout << "Visualizzazione terminata"<<endl; 
}


Allegati:
15986_2255f5c8c736b418a7696b888a2abbea.jpg
15986_2255f5c8c736b418a7696b888a2abbea.jpg

4 Risposte

  • Re: Doppia lista concatenata

    "la compilazione va in crash" ?

    In che senso?
  • Re: Doppia lista concatenata

    Intendevo dire che l'eseguibile va in crash, non va il punto 3 quello di stampa della seconda lista.
  • Re: Doppia lista concatenata

    ken17 ha scritto:


    Intendevo dire
    Beh ... sono cose diverse ... bisogna essere chiari ...

    E in quale linea avviene il crash? Non hai eseguito con il debugger il codice?
  • Re: Doppia lista concatenata

    Ora non sono davanti al pc, cmq la selezione 3 é quella che non va. Sono da rivedere le ultime 2 funzioni
Devi accedere o registrarti per scrivere nel forum
4 risposte