Inserire primi n elementi in lista e altri in albero

di il
6 risposte

Inserire primi n elementi in lista e altri in albero


if (myfile.is_open()) {

		int anno;
		string nome;
		float tempo;
		string luogo;
		string a;
		string t;
		Item it;
		int count = 0;

		while (getline(myfile, a, ':')) {
			istringstream token(a);
			token >> anno;


			getline(myfile, t, ':');
			istringstream token2(t);
			token2 >> tempo;


			getline(myfile, nome, ':');


			getline(myfile, luogo);


			Item it(anno, nome, tempo, luogo);


			count++;
			bubblesort(L1);

			L1.moveToStart();


			if (count < 12 ) // se il contenuto di un certo campo dell'item , risulta essere diverso dal valore di confronto , allora
				L1.append(it); // lo si inserisce in coda nella lista

			else 
				Albero.insert(it);
			
			

		}
	}

dopo aver aperto un file nel formato ( anno , nome , tempo , luogo ) devo inserire i primi 12 item con campo tempo più piccoli in una lista mentre gli altri in un albero. per risolverlo ho pensato
1) a mano a mano che estrapolo gli elementi dal file li ordino
2) contemporaneamente imposto a zero un contatore che incremento ogni volta che creo un item
3) imposto la condizione per la quale se il contatore è < 12 allora l'item viene inserito in lista altrimenti nell'albero


se tolgo la condizione la lista mi viene ordinata correttamente , quindi probabilmente il mio ragionamento è sbagliato.. ho pensato anche che , dato che senza la condizione l'ordinamento è giusto , si tratterebbe 'solo' di lasciare nella lista i primi 12 item ( poichè già ordinata ) e togliere gli altri. poi gli item tolti inserirli nell'albero

non capisco se il mio ragionamento ha un minimo di senso ma l'ho scritto male o se proprio non ha ne capo ne coda.

l'argoritmo di ordinamento che ho utilizzato è


void bubblesort(List<Item>& L) {
	for (int i = 0; i < (L.length() - 1); i++) {
		for (int j = (L.length() - 1); j > i; j--) {
			L.moveToPos(j);
			Item it_j = L.getValue();
			L.moveToPos(j - 1);
			Item it_jj = L.getValue();
			if (it_jj.gettempo() > it_j.gettempo())
			{
				L.moveToPos(j);
				Item removed = L.remove();
				L.moveToPos(j - 1);
				L.insert(removed);
			}
		}
	}
}


6 Risposte

  • Re: Inserire primi n elementi in lista e altri in albero

    Se l'item con il tempo più piccolo è esattamente l'ultimo del file, che succede? Avrebbe avuto senso complicarsi la vita a riordinare ogni volta?

    Fai passaggi semplici e separa le operazioni
    - apri il file e aggiungi tutti gli item alla lista
    - chiudi il file
    - bubble sort sulla lista (una volta sola)
    - rimozione degli elementi dalla lista dal tredicesimo item in poi e contestualmente inserimento nell'albero

    p.s.: bubblesort forse sarebbe meglio che lo testassi in un programma a parte prima di utilizzarlo, mostrando il codice di remove(), insert() eccetera
  • Re: Inserire primi n elementi in lista e altri in albero

    Ciao, di che albero si tratta?
    Se è un albero semplice (binario per esempio) conviene inserire gli elementi nell'albero che, per natura, dovrebbe essere già ordinato e poi estrarre da esso i primi 12 (intendendo con estrazione, lettura e rimozione) che aggiungerai alla lista.
    Se non hai vincoli sull'albero, potresti ordinarlo in modo decrescente così gli elementi da estrarre sono solo sulle foglie, per esempio.
  • Re: Inserire primi n elementi in lista e altri in albero

    Facendo due giorni di prove sono finalmente riuscita ad eliminare dalla lista gli elementi dopo il 12esimo. anche se tutt'ora non capisco perchè mettendo 12 nella condizione mi vengano stampati in lista più elementi. per avere i primi 12 elementi ho dovuto mettere 10 nell'if e il motivo non l'ho ben compreso... non risco però ad inserire gli elementi cancellati nell'albero. la riga commentata è quella relativa all'inserimento degli elementi cancellati nell'albero ma non mi da nulla di logico
    
    int position = 0;
    	while (L1.currPos() < L1.length()) {
    		Item curvalue = L1.getValue();
    		L1.next();
    		while (L1.currPos() < L1.length()) {
    			if (position > 10)
    				L1.remove();
    			else
    				//Albero.insert(curvalue);
    				L1.next();
    			
    		}
    		L1.moveToPos(position);
    		L1.next();
    		position += 1;
    	}
    
    
    
    
  • Re: Inserire primi n elementi in lista e altri in albero

    Finalmente ci sono riuscita cosi funziona tutto ( in teoria ) come dovrebbe
    
    
    
    	Item it;
    	Item removed;
    	L1.moveToStart();
    	
    
    	int position = 0;
    	while (L1.currPos() < L1.length()) {
    		Item curvalue = L1.getValue();
    		L1.next();
    		while (L1.currPos() < L1.length()) {
    			if (position > 10)
    			{   
    				removed = L1.remove();
    				Albero.insert(removed);
    				Albero.balance();
    			}
    			     
    			else
    				L1.next();
    		}
    
    		L1.moveToPos(position);
    		L1.next();
    		position += 1;
    	}
    
    
  • Re: Inserire primi n elementi in lista e altri in albero

    Ma non puoi semplicemente fare qualcosa tipo
    
    	int i = L1.length() -12;
    	for(; i > 0; i--) {
    		L1.moveToPos(L1.length() -1); // oppure L1.moveToEnd() se esiste
    		Item removed = L1.remove();
    		Albero.insert(removed);
    		Albero.balance();
    	}
    
    ?

    Il resto è a posto? Il sort?
  • Re: Inserire primi n elementi in lista e altri in albero

    Il bubblesort l’ho testato in un programma a parte e funziona correttamente, il codice in questo caso è quasi uguale a come lo avevamo visto a lezione. Ho modificato qualcosa perché qui era richiesto l’ordinamento in base ad un campo particolare dell’item. Per il resto del codice sicuramente il tuo è decisamente più corto ed efficiente, ora cerco di guardarmelo bene ( magari su carta prima ) in modo da capirne bene la logica. Sono decisamente lontanissima dal trovare soluzioni efficaci, va ancora bene se riesco a far fare al programma quello che dovrebbe , quindi studiare un secondo metodo non mi farà male
Devi accedere o registrarti per scrivere nel forum
6 risposte