Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Realizzazione lista circolare con doppi puntatori

    Salve ragazzi.
    Dovrei tradurre la lista circolare con doppi puntatori presente in queste slide da C++ a Java, ma ahimè non ottengo l'effetto desiderato.
    Le specifiche da seguire sono quelle in queste slide.

    Eccovi il mio sorgente

    È possibile? Se si, potete indicarmi cosa sbaglio?

    Sinceramente alcune cose presenti nelle slide non riesco ad ottenerle in java mancando i puntatori, quindi non so come risolvere il problema.
    Eppure in Java c'è la LinkedList, quindi dovrebbe essere possibile...

    Vi ringrazio per l'eventuale aiuto =)
    I miei esempi in Java qui: http://cdpjavaexamples.altervista.org/index.html

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    55
    Ciao, riesci a fare un riassunto delle cose che non riesci a fare e come hai provato a farle? Perdona ma non ho molta voglia di leggermi tutte quelle slide

  3. #3
    quello che non riesco a fare sono i metodi insLista e cancLista...
    il primo perchè non posso impostare la posizione=tmp in quanto in java gli oggetti vengono passati per valore, il secondo non posso fare la delete xche in java nn c'è ed, anche settando il valore a null, avrei il problema identico dell'insLista...
    Per quanto riguarda le implementazioni, le ho fatte seguendo le slide di C++ visto che devo tradurle da li...
    I miei esempi in Java qui: http://cdpjavaexamples.altervista.org/index.html

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    55
    Non riesco a scaricare il tuo codice e nemmeno le slide.
    Se posti qui un estratto di codice e fai un riassunto di quello che ti dice la slide possiamo vedere.

  5. #5
    ecco la classe Lista:
    codice:
    package liste.puntatori.circolari;
    
    import liste.ListaA;
    import liste.Posizione;
    
    /**
     * Lista con doppi puntatori circolare
     * @author Prete Cosimo Damiano, Galiandro Rosita
     */
    public class Lista<T> extends ListaA<T>{
        private NodoPuntatore lista;
        
        /**
         * Costruttore (la sentinella punta a se stessa)
         */
        public Lista(){
            lista=new NodoPuntatore();
            lista.setPrecedente(lista);
            lista.setSuccessivo(lista);
        }
        
        /**
         * Controlla se la lista è vuota o meno
         * @return true se la lista è vuota, false altrimenti
         */
        @Override
        public boolean listaVuota() {
            return lista.getPrecedente()==lista && lista.getSuccessivo()==lista;
        }
        
        /**
         * Permette di conoscere un elemento della lista data la sua posizione
         * @param posizione la posizione dell'elemento cercato (dev'essere di tipo NodoPuntatore)
         * @return l'informazione del nodo se la posizione è valida, null altrimenti
         */
        @Override
        public T leggiLista(Posizione posizione) {
            if(istanzaPosizione(posizione)){
                return (T)((NodoPuntatore)posizione).getInfo();
            }
            return null;
        }
        
        /**
         * Inserisce il dato elem alla posizione posizione eventualmente sovrascrivendo il precedente
         * @param elem l'elemento da inserire
         * @param posizione la posizione in cui inserire l'elemento (dev'essere di tipo NodoPuntatore)
         */
        @Override
        public void scriviLista(T elem, Posizione posizione) {
            if(istanzaPosizione(posizione)){
                ((NodoPuntatore)posizione).setInfo(elem);
                size++;
            }
        }
        
        /**
         * Ritorna la prima posizione della lista
         * @return la prima posizione della lista, cioè il nodo successivo alla lista stessa
         */
        @Override
        public Posizione primoLista() {
            return lista.getSuccessivo();
        }
        
        /**
         * Controlla che si sia raggiunta la fine della lista
         * @param posizione la posizione per cui fare il controllo (dev'essere di tipo NodoPuntatore)
         * @return true se si è arrivati alla fine, false altrimenti
         */
        @Override
        public boolean fineLista(Posizione posizione) {
            if(istanzaPosizione(posizione)){
                return posizione.equals(lista);
            }
            return false;
        }
        
        /**
         * Permette di conoscere la posizione successiva data una certa posizione
         * @param posizione la posizione per cui calcolare la successiva (dev'essere di tipo NodoPuntatore)
         * @return la nuova posizione, o la stessa d'ingresso se non valida
         */
        @Override
        public Posizione succLista(Posizione posizione) {
            return istanzaPosizione(posizione)?((NodoPuntatore)posizione).getSuccessivo():posizione;
        }
    
        /**
         * Permette di conoscere la posizione precedente data una certa posizione
         * @param posizione la posizione per cui calcolare la precedente (dev'essere di tipo NodoPuntatore)
         * @return la nuova posizione, o la stessa d'ingresso se non valida
         */
        @Override
        public Posizione predLista(Posizione posizione) {
            return istanzaPosizione(posizione)?((NodoPuntatore)posizione).getPrecedente():posizione;
        }
        
        /**
         * Inserisce l'elemento elem alla posizione posizione della lista, eventualmente ricombinando i collegamenti con gli altri nodi
         * @param elem l'elemento da inserire
         * @param posizione la posizione in cui inserire l'elemento (dev'essere di tipo NodoPuntatore)
         */
        @Override
        public void insLista(T elem, Posizione posizione) {
            if(istanzaPosizione(posizione)){
                NodoPuntatore p=(NodoPuntatore)posizione;
                NodoPuntatore tmp=new NodoPuntatore(elem);
                tmp.setPrecedente(p.getPrecedente());
                tmp.setSuccessivo(p);
                p.getPrecedente().setSuccessivo(tmp);
                p.setPrecedente(tmp);
                size++;
            }
        }
    
        /**
         * Cancella l'elemento della lista in una data posizione
         * @param posizione la posizione dell'elemento da cancellare (dev'essere di tipo NodoPuntatore)
         */
        @Override
        public void cancLista(Posizione posizione) {
            if(istanzaPosizione(posizione)){
                NodoPuntatore p=(NodoPuntatore)posizione;
                p.getSuccessivo().setPrecedente(p.getPrecedente());
                p.getPrecedente().setSuccessivo(p.getSuccessivo());
                size--;
                
            }
        }
        
        /**
         * Controlla che la posizione sia un'instanza della classe NodoPosizione
         * @param posizione la posizione da controllare
         * @return true se posizione è di classe NodoPuntatore, false altrimenti
         */
        @Override
        protected boolean istanzaPosizione(Posizione posizione) {
            return posizione instanceof NodoPuntatore;
        }
    
    }
    e la classe NodoPuntatore:
    codice:
    package liste.puntatori.circolari;
    
    import liste.Nodo;
    import liste.Posizione;
    
    /**
     * Classe usata per gestire l'informazione nella lista con doppi puntatori
     * @author Prete Cosimo Damiano, Galiandro Rosita
     */
    public class NodoPuntatore<T> extends Nodo<T> implements Posizione{
        private NodoPuntatore prec, succ;
        
        /**
         * Costruttore vuoto
         */
        public NodoPuntatore(){}
        /**
         * Costruttore
         * @param dato il dato da memorizzare nel nodo
         */
        public NodoPuntatore(T dato){
            super(dato);
        }
        /**
         * Costruttore
         * @param d il dato da memorizzare nel nodo
         * @param p il nodo precedente
         * @param s il nodo successivo
         */
        public NodoPuntatore(T d, NodoPuntatore p, NodoPuntatore s){
            this(p, s);
            setInfo(d);
        }
        /**
         * Costruttore
         * @param p la posizione precedente
         * @param s la posizione successiva
         */
        public NodoPuntatore(NodoPuntatore p, NodoPuntatore s){
            setPrecedente(p);
            setSuccessivo(s);
        }
        /**
         * Imposta un nuovo successivo al nodo
         * @param s il nodo con cui rimpiazzare il nodo successivo
         */
        public void setSuccessivo(NodoPuntatore s){
            succ=s;
        }
        /**
         * Imposta un nuovo precedente al nodo
         * @param p il nodo con cui rimpiazzare il nodo precedente
         */
        public void setPrecedente(NodoPuntatore p){
            prec=p;
        }
        /**
         * Permette di conoscere il nodo successivo
         * @return il nodo successivo
         */
        public NodoPuntatore getSuccessivo(){
            return succ;
        }
        /**
         * Permette di conoscere il nodo precedente
         * @return il nodo precedente
         */
        public NodoPuntatore getPrecedente(){
            return prec;
        }
    }
    Come dicevo in qualche messaggio precedente, i metodi che non fanno esattamente il loro lavoro sono l'insLista e il cancLista per i problemi suddetti.
    Questi sono i corrispettivi metodi in C++:
    codice:
    template<_class_T_>_void_circLista<_T_>::insLista(tipoelem_a,_Lista::posizione_&p){
    __Lista::posizione_temp;
    __temp_=_new_Cella;
    __temp_>setElemento(a);
    __temp_>setPrec(p_>getPrec());
    __temp_>setSucc(p);
    __(p_>getPrec())_>setSucc(temp);
    __p_>setPrec(temp);
    __p=temp;
    }
    codice:
    template<_class_T_>_void_circLista<_T_>::cancLista(Lista::posizione_&p){
    __Lista::posizione_temp;
    __temp=p;
    __(p_>getSucc())_>setPrec(p_>getPrec());
    __(p_>getPrec())_>setSucc(p_>getSucc());
    __p=p_>getSucc();
    __delete(temp);
    }
    Spero ora possiate aiutarmi ^^
    I miei esempi in Java qui: http://cdpjavaexamples.altervista.org/index.html

  6. #6
    Nessuno può aiutarmi?
    Il problema riguarda appunto l'ultima riga dei due metodi in C++ (p=temp e delete(temp)) perchè non so come farle in java.
    I miei esempi in Java qui: http://cdpjavaexamples.altervista.org/index.html

  7. #7
    up
    I miei esempi in Java qui: http://cdpjavaexamples.altervista.org/index.html

  8. #8
    up
    I miei esempi in Java qui: http://cdpjavaexamples.altervista.org/index.html

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.