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: