|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Apr 2013
Messaggi: 27
|
[JAVA] Coda doppia
Ciao a tutti sto progettando il dato astratto coda doppia in java, (consente di inserire, cancellare, esaminare elementi in entrambe le estremità) implementandolo con una lista doppiamente collegata. Ci sto impiegando troppo tempo e mi sto confondendo parecchio..mi servirebbe una mano, grazie.
Codice:
package coda;
public class CodaDoppiaCollegata implements CodaDoppia {
private Record inizio = null; //Punta all'elemento in testa
private Record fine = null; ////Punta all'elemento in coda
private class Record {
public Object elem;
public Record next; //Punta all'elemento successivo
public Record prev; //Punta all'elemento precedente
public Record(Object e) {
elem = e;
next = prev = null;
}
}
@Override
/**
* Inserisce un elemento in testa.
*/
public void enqueueStart(Object e) {
Record p = new Record(e);
if(isEmpty()) {
inizio = fine = p;
} else {
inizio.next = new Record(e);
inizio = inizio.next;
}
}
@Override
/**
* Inserisce un elemento in coda.
*/
public void enqueueEnd(Object e) {
Record p = new Record(e);
if(isEmpty()) {
inizio = fine = p;
} else {
fine.next = p;
fine = fine.next;
}
}
@Override
/**
* Rimuove l'elemento in testa.
*/
public void dequeueStart() {
if(isEmpty())
throw new EccezioneStrutturaVuota("CODA VUOTA!");
inizio = inizio.next;
}
@Override
/**
* Rimuove l'elemento in coda.
*/
public void dequeueEnd() {
if(isEmpty())
throw new EccezioneStrutturaVuota("CODA VUOTA!");
fine = fine.next;
}
@Override
/**
* Verifica se la coda e' vuota.
*/
public boolean isEmpty() {
return (inizio == null) && (fine == null);
}
@Override
/**
* Restituisce l'elemento in testa.
*/
public Object first() {
if(isEmpty())
throw new EccezioneStrutturaVuota("CODA VUOTA!");
return inizio.elem;
}
@Override
/**
* Restituisce l'elemento in coda.
*/
public Object last() {
if(isEmpty())
throw new EccezioneStrutturaVuota("CODA VUOTA!");
return fine.elem;
}
private static void inizializza(CodaDoppia doubleQueue) {
doubleQueue.enqueueStart("secondo");
doubleQueue.enqueueStart("primo");
doubleQueue.enqueueEnd("terzo");
doubleQueue.enqueueEnd("quarto");
}
public static void main(String args[]) {
CodaDoppia test = new CodaDoppiaCollegata();
inizializza(test);
System.out.println(test.first());
System.out.println(test.last());
test.dequeueStart();
System.out.println(test.first());
test.dequeueEnd();
System.out.println(test.last());
}
}
Ultima modifica di michelexeno : 20-12-2013 alle 21:51. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2787
|
prev non lo usi praticamente mai... inoltre dovresti inizializzare anche il prev/next dell'elemento che inserisci, non solo aggiornare (correttamente) la vecchia testa/coda
|
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Apr 2013
Messaggi: 27
|
In precedenza i metodi per aggiungere in testa e coda gli elementi gli avevo scritti cosi
Codice:
@Override
/**
* Inserisce un elemento in testa.
*/
public void enqueueStart(Object e) {
Record p = new Record(e);
if(isEmpty()) {
inizio = fine = p.prev = p.next = p;
} else {
p.next = inizio.next;
inizio.next.prev = p;
inizio.next = p;
inizio = inizio.next;
}
}
@Override
/**
* Inserisce un elemento in coda.
*/
public void enqueueEnd(Object e) {
Record p = new Record(e);
if(isEmpty()) {
inizio = fine = p.prev = p.next = p;
} else {
p.next = fine;
fine.next.prev = p;
fine.next = p;
fine = fine.next;
}
}
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2787
|
Ma quello che hai scritto non ha alcun senso
Non è difficile da tradurre in codice se hai capito la struttura a livello concettuale. Inizio e fine puntano rispettivamente al primo e all'ultimo elemento. Se la coda è vuota non puntano a nulla. Se la coda contiene un solo elemento ovviamente inizio e fine puntano allo stesso elemento. Il precedente di ogni nodo punta al precedente a meno che l'elemento è in testa, nel qual caso punta a null. Il successivo di ogni nodo punta al successivo a meno che l'elemento è alla fine nel qual caso punta a null. Quando viene inserito un elemento in testa questo diventa il nuovo inizio. Il "vecchio inizio" diventa il suo successore, inoltre il "nuovo inizio" diventa il predecessore del "vecchio inizio". Ragionamento analogo quando inserisci un elemento in coda. |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Sep 2007
Città: Albiolo (CO)
Messaggi: 165
|
Prova così.. Dovrebbe funzionare.. E ricordati di definire il lancio delle eccezioni nell'interfaccia..
Codice:
public class CodaDoppiaCollegata implements CodaDoppia {
private Record inizio = null; //Punta all'elemento in testa
private Record fine = null; ////Punta all'elemento in coda
private class Record {
public Object elem;
public Record next; //Punta all'elemento successivo
public Record prev; //Punta all'elemento precedente
public Record(Object e) {
elem = e;
next = prev = null;
}
}
@Override
/**
* Inserisce un elemento in testa.
*/
public void enqueueStart(Object e) throws EccezioneStrutturaVuota {
Record p = new Record(e);
if(isEmpty()) {
inizio = fine = p;
} else {
p.next = inizio;
inizio.prev = p;
inizio = p;
}
}
@Override
/**
* Inserisce un elemento in coda.
*/
public void enqueueEnd(Object e) throws EccezioneStrutturaVuota {
Record p = new Record(e);
if(isEmpty()) {
inizio = fine = p;
} else {
fine.next = p;
p.prev = fine;
fine = p;
}
}
@Override
/**
* Rimuove l'elemento in testa.
*/
public void dequeueStart() throws EccezioneStrutturaVuota {
if(isEmpty())
throw new EccezioneStrutturaVuota("CODA VUOTA!");
inizio = inizio.next;
inizio.prev = null;
}
@Override
/**
* Rimuove l'elemento in coda.
*/
public void dequeueEnd() throws EccezioneStrutturaVuota {
if(isEmpty())
throw new EccezioneStrutturaVuota("CODA VUOTA!");
fine = fine.prev;
fine.next = null;
}
@Override
/**
* Verifica se la coda e' vuota.
*/
public boolean isEmpty() throws EccezioneStrutturaVuota {
return (inizio == null) && (fine == null);
}
@Override
/**
* Restituisce l'elemento in testa.
*/
public Object first() throws EccezioneStrutturaVuota {
if(isEmpty())
throw new EccezioneStrutturaVuota("CODA VUOTA!");
return inizio.elem;
}
@Override
/**
* Restituisce l'elemento in coda.
*/
public Object last() throws EccezioneStrutturaVuota {
if(isEmpty())
throw new EccezioneStrutturaVuota("CODA VUOTA!");
return fine.elem;
}
private static void inizializza(CodaDoppiaCollegata doubleQueue) throws EccezioneStrutturaVuota {
doubleQueue.enqueueStart("secondo");
doubleQueue.enqueueStart("primo");
doubleQueue.enqueueEnd("terzo");
doubleQueue.enqueueEnd("quarto");
}
public static void main(String args[]) {
CodaDoppiaCollegata test = new CodaDoppiaCollegata();
try {
inizializza(test);
System.out.println(test.first());
System.out.println(test.last());
test.dequeueStart();
System.out.println(test.first());
test.dequeueEnd();
System.out.println(test.last());
} catch (EccezioneStrutturaVuota ex) {
System.out.println(ex.getMessage());
}
}
}
|
|
|
|
|
|
#6 | |
|
Junior Member
Iscritto dal: Apr 2013
Messaggi: 27
|
Quote:
Grazie e buone feste |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2787
|
Occhio che nel codice di PHØΞИIX c'è un problema nei dequeue: quando la coda contiene un solo elemento vanno in errore.
|
|
|
|
|
|
#8 |
|
Junior Member
Iscritto dal: Apr 2013
Messaggi: 27
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:50.




















