Allora, prima di tutto vi dico che ho molti dubbi sul funzionamento del programma, quindi ho preferito mettergli questo nome (nel topic).
Spero che ci sia qualche persona così gentile da aiutarmi.
La traccia è questa:
codice:
Con riferimento alla classe lista implementata nel progetto C++ fornito per la prova scritta,
lo studente provveda ad aggiungere le seguenti funzionalità:
a)realizzazione di una classe derivata dalla classe lista che implementi una "coda";
b)definizione del costruttore di assegnazione;
c)definizione di una funzione membro operator+ della classe lista che riceve un'altra lista
come argomento e produce una nuova lista accodando gli elementi di tali liste;
d)definizione di una funzione membro della classe lista che elimini gli
eventuali doppioni presenti;
All'avvio del programma era fornito un file con alcune parti già scritte, e bisognava aggingere le parti mancanti.
Elenco tutto quello che c'era scritto:
Nel newmain.cpp:
codice:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include "LIST-LIB.h"
using namespace std;
int main()
{
int x,scelta;
//Definire qui le strutture dati da usare nel programma
do
{
system("cls");
puts("\nFunzioni disponibili\n");
puts("\t 1 - Inserisci elemento\n");
puts("\t 2 - Elimina elemento\n");
puts("\t 3 - Trova elemento\n");
puts("\t 4 - Stampa lista\n");
puts("\t 5 - Ordina lista\n");
puts("\t 6 - Esercizio da svolgere nella prova scritta\n");
puts("\t 7 - Esci\n");
do
{
printf("\rScelta = ");
if(scanf("%d",&scelta)!=1)
{
fflush(stdin);
scelta=0;
}
} while ( (scelta<1)||(scelta>8) );
if (scelta != 7)
{
switch(scelta)
{
case 1: printf("\nInserisci un elemento: ");
if(scanf("%d",&x)!=1)
{
printf("Valore inserito errato\n");
fflush(stdin);
}
else
;//Effettuare l'inserimento;
break;
case 2: printf("\nElemento da cancellare: ");
if(scanf("%d",&x)!=1)
{
printf("Valore inserito errato\n");
fflush(stdin);
}
else
;//Effettuare la cancellazione;
break;
case 3: printf("\nElemento da cercare: ");
if(scanf("%d",&x)!=1)
{
printf("Valore inserito errato\n");
fflush(stdin);
}
else
;//Effettuare la ricerca;
break;
case 4: printf("\nElementi inseriti in lista %d\n");
//Effettuare la stampa;
break;
case 5: printf("\nOrdinamento lista %d...\n");
//Effettuare l'ordinamento;
break;
case 6: printf("\nFEsercizio d'esame\n");
//Inserisci qui le chiamate relative all'esercizio di esame;
break;
} // end switch(scelta)
} // end if(scelta != 7):
system("pause");
}while(scelta!=7);
}
Nel file LIST-LIB.h:
codice:
struct nodo
{
int valore;
nodo *succ;
};
class lista
{
nodo *l;
nodo* insert(nodo *p,int x);
bool find(nodo *, int);
nodo* split(nodo *l1);
nodo* merge(nodo *l1, nodo *l2);
nodo* mergesort(nodo *list);
public:
lista(){l=0;} //Costruttore
~lista(); //Distruttore
void push(int);
bool cancella(int);
void stampa();
bool trova(int);
void ordina();
};
Nel file LIST-LIB.cpp:
codice:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include "LIST-LIB.h"
using namespace std;
//Funzione distruzione
lista::~lista()
{
nodo *p;
while (l!=0)
{
p=l;
l=l->succ;
delete p;
cout<<'#';
}
cout<<endl;
}
//Funzione di inserimento elemento in lista
void lista::push(int x)
{
l=insert(l,x);
}
/*Inserisce gli elementi in modo disordinato (inserimento in testa)*/
nodo* lista::insert(nodo *p,int x)
{
nodo *q;
cout<<"insert:versione con inserimento in testa"<<endl;
q=new nodo; //alloca un elemento;il suo indirizzo è q;
q->valore=x;
q->succ=p;
p=q;
return p;
}
/*Cancella un elemento dalla lista - restituisce true se l'elemento è stato trovato
*N.B. non si fanno ipotesi sull'ordinamento della lista*/
bool lista::trova(int x)
{
return find(l,x);
}
bool lista::find(nodo *lc,int elem) /*ricorsiva*/
{
if(lc==0)
return false;
else if (lc->valore==elem)
return true;
else
return find(lc->succ,elem);
}
/*Orinamento della lista con il metodo merge-short*/
void lista::ordina()
{
l=mergesort(l);
}
nodo *lista::split(nodo *l1)
{
nodo *l2;
if((l1==0)||(l1->succ==0))
return NULL;
l2=l1->succ;
l1->succ=l2->succ;
l2->succ=split(l1->succ);
return l2;
}
nodo *lista::merge(nodo *l1,nodo *l2)
{
if(l1==NULL)
return l2;
if(l2==NULL)
return l1;
if(l1->valore <= l2->valore)
{
l1-> succ=merge(l1->succ,l2);
return l2;
}
}
nodo *lista::mergesort(nodo *l1)
{
nodo *l2;
if((l1==0)||(l1->succ=0))
return l1;
else
{l2=split(l1);
l1=mergesort(l1);
l2=mergesort(l2);
return merge(l1,l2);
}
}
Sapreste mettermi in ordine i pezzi, in modo da farli funzionare(dato che ci ho capito ben poco)?
E un'ultima cosa...... ma il printf e lo scanf si possono usare in C++ , o bisogna cambiare anche quelli(sembrano funzionare ugualmente)?
Spero che qualcuno mi aiuti
......