Avatar billede kube Nybegynder
07. marts 2002 - 17:54 Der er 9 kommentarer og
1 løsning

slet() metode!

Hej Eksperter,
jeg har en dobbelthægtet liste med pointerne
foerste, aktuel, naeste og forrige.

problemet er at jeg skal have en funktion der kan slette et af elementerne i listen, og så skal de andre elementers pointere jo bare springe det givne element over, men hvordan løses det!

mvh kube

Avatar billede disky Nybegynder
07. marts 2002 - 17:58 #1
ud fra det element der skal slettes tager du next referencen, og sætter previous objectets next pointer til denne værdi, det samme med previous pointere.
Avatar billede disky Nybegynder
07. marts 2002 - 18:02 #2
du har 3 objecter i din hægtede liste, alle 3 objecter han en next pointer der peger på næste object og en previous pointer der peger på foregående object.

1:
next: peger på #2
previous: peger på sig selv da der ikke er et foregående.

2:
next: peger på #3
previous: peger på #1

3:
next: peger på ingenting da der ikke er en næste
previous: peger på #2

vi vil nu slette #2
Vi gemmer værdierne af #2's next og previous pointer.
#1's next pointer skal så sættes til den next værdi vi lige har gemt.
#3's previous pointer skal så sættes til den previous værdi vi lige har gemt.
Så ser det sådanne ud:

#1
next: #3
previous: ingenting

#3
next: ingenting
previous: #1



object #2 er hermed blever fjernet fra din liste.

Nogle gange har man en cirkular dobbelthægtet liste altså at sidste element peger på det første og omvendt.
Avatar billede kube Nybegynder
07. marts 2002 - 18:31 #3
jeg har kigget lidt på det - her er hvad jeg er kommet frem til, men det virker ikke helt efter planen, er der noget du kan se der skal laves om?

public void slet(listeElement aktuel)
    {
        listeElement temp1= aktuel.naeste;
        listeElement temp2= aktuel.forrige;

        aktuel.forrige= temp1;
        aktuel.naeste= temp2;
    }
Avatar billede disky Nybegynder
07. marts 2002 - 18:56 #4
Du skulle tage og gøre naeste,forrige private og tilgå dem via get/set metoder.

Kan du lige poste din listeElement klasse
Avatar billede disky Nybegynder
07. marts 2002 - 19:02 #5
prøv med.

public void slet(listeElement aktuel)
    {
        listeElement temp1= aktuel.naeste;
        listeElement temp2= aktuel.forrige;

        aktuel.forrige.naeste= temp1;
        aktuel.naeste.forrige= temp2;
        aktuel.forrige=null;
        aktuel.naeste=null;
    }
Avatar billede kube Nybegynder
07. marts 2002 - 22:53 #6
bedre sent end aldrig - har lige været væk et par timer. Jeg prøver først lige med din sidste metode...

//klassen VideoListe har metoder der konstruere den dobbelthægtede liste
//og indsætter Videoer objektet i listen efter alfabetisk rækkefølge
class VideoListe
{

    //intern klasse, der definerer opbygningen af et listeElement
    class listeElement
    {
        Videoer v; //Videoer objektet
        listeElement forrige, naeste; //reference til forrige og naeste element i listen

        //konstruktør der modtager et Videoer objekt og sætter denne lig v
        public listeElement(Videoer nyVideo)
        {
            v = nyVideo;
            forrige = null;
            naeste = null;
        }

    }


    private listeElement foerste, sidste, aktuel;

    VideoListe()
    {
        this.foerste= null;
        this.sidste= null;

    }

    //indsæt metode der indsætter det modtagne objekt i listen alfabetisk rækkefølge
    //efter originale titel på videoen
    public void indsaet(Videoer hv)
    {
        listeElement ny = new listeElement(hv);

        if (foerste == null)
        {
            foerste = ny;
            sidste = ny;

        }

        else
        {
            listeElement aktuel = foerste;

            if (alfabetiskFoer(ny.v, foerste.v)) {
            ny.naeste = foerste;
            foerste.forrige = ny;
            foerste = ny;

        }
        else
        {
            while (aktuel.naeste!=null && !alfabetiskFoer(ny.v, aktuel.naeste.v))
                aktuel = aktuel.naeste;

                ny.naeste = aktuel.naeste;
                ny.forrige = aktuel;
                aktuel.naeste = ny;

            if (ny.naeste!=null)
                    ny.naeste.forrige = ny;

            else sidste = ny;
        }


        }
    }

    //hjælpemetode til indsaet(), der returnerer -true- hvis Videoer v1 kommer alfabetisk før Videoer v2
    //ellers retuneres boolean værdien -false-
    private boolean alfabetiskFoer(Videoer v1, Videoer v2)
    {
        if (v1.getoTitel().compareTo(v2.getoTitel())<=0)
                return true;

        else return false;
    }


    //frem() - metode til at bladre i listen fra GUIen
    public void frem()
    {
        if(aktuel==null)
        {
            aktuel= foerste;
        }
        else if(aktuel.naeste== null)
        {
            aktuel= foerste;
        }
        else aktuel= aktuel.naeste;
    }


    //tilbage() - metode til at bladre i listen fra GUIen
    public void tilbage()
    {
      if(aktuel==null)
      {
          aktuel= sidste;
      }
        else if(aktuel.forrige==null)
        {
            aktuel= sidste;
        }
        else aktuel= aktuel.forrige;
    }

    //nedenstående er hentmetoder der gør det muligt fra GUIen at udskrive
    //og bladre i listen af Videoer

    public String hentTitel()
    {
        return aktuel.v.getoTitel();
    }

    public String hentDanskTitel()
    {
        return aktuel.v.getDanskTitel();
    }

    public String hentNationalitet()
    {
        return aktuel.v.getNationalitet();
    }

    public String hentArt()
    {
        return aktuel.v.getArt();
    }

    public int hentAar()
    {
        return aktuel.v.getAar();
    }

    public String hentInstruktoer()
    {
        return aktuel.v.getInstruktoer();
    }

    public String hentSkuespillere()
    {
        return aktuel.v.getSkuespillere();
    }

    public String hentRegnr()
    {
        return aktuel.v.getRegnr();
    }

    public void sogTitel(String stitel, String snationalitet, String sArt, int sfraAar, int stilAar, String sinstruktoer, String sskuespillere)
    {
        for(aktuel= foerste; aktuel!=null; aktuel= aktuel.naeste)
        {
            if(stitel.equals("?")==false)
            {
                int i= aktuel.v.getoTitel().toLowerCase().indexOf((stitel).toLowerCase());
                if(i<0)
                {
                    slet(aktuel);
                    System.out.println("titel: "+aktuel.v.getoTitel());
                }
            }
            if(snationalitet.equals("?")==false)
            {
                if(snationalitet.equals(aktuel.v.getNationalitet())==false)
                {
                    slet(aktuel);
                    System.out.println("nationalitet: "+aktuel.v.getoTitel());
                }
            }
            if(sArt.equals("?")==false)
            {
                if(sArt.equals(aktuel.v.getArt())==false)
                {
                    slet(aktuel);
                    System.out.println("art: "+aktuel.v.getoTitel());
                }
            }
            if(sfraAar!=0 && stilAar!=0)
            {
                if(sfraAar<=aktuel.v.getAar() && aktuel.v.getAar()<=stilAar)
                {
                    slet(aktuel);
                    System.out.println("år: "+aktuel.v.getoTitel());
                }
            }
            if(sinstruktoer.equals("?")==false)
            {
                if(sinstruktoer.equals(aktuel.v.getInstruktoer())==false)
                {
                    slet(aktuel);
                    System.out.println("instruktør: "+aktuel.v.getoTitel());
                }
            }

            if(sskuespillere.equals("?")==false)
            {
                if(sskuespillere.equals(aktuel.v.getSkuespillere())==false)
                {
                    slet(aktuel);
                    System.out.println("skuespillere: "+aktuel.v.getoTitel());
                }
            }
        }


    }

    public void slet(listeElement aktuel)
    {
        listeElement temp1= aktuel.naeste;
        listeElement temp2= aktuel.forrige;

        aktuel.forrige= temp1;
        aktuel.naeste= temp2;
    }

    //public void slet(String titel)
    //{
    //    if (titel==foerste.v.getoTitel())
    //                foerste= foerste.naeste;
    //    else
    //    {
    //        listeElement aktuel= foerste;
    //        while (aktuel.naeste!=null && aktuel.naeste.v.getoTitel()!=titel)
    //                aktuel= aktuel.naeste;

    //        if (aktuel!=null)
    //            aktuel.forrige= aktuel.naeste.naeste.forrige;
    //            aktuel.naeste= aktuel.naeste.naeste;
    //    }
    //}

}
Avatar billede kube Nybegynder
07. marts 2002 - 22:57 #7
der bliver kastet NullPointerException!!
Avatar billede disky Nybegynder
08. marts 2002 - 00:20 #8
hvor henne ?
Avatar billede kube Nybegynder
08. marts 2002 - 00:27 #9
denne metode har jeg fået bikset sammen - den virker næsten efter planen!
Jeg har tænkt mig at lukke, men giver dig point for
dit andet svar med forklaring på hvad der skulle gøres, den satte mig lidt i sving.

her er metoden

public void slet(listeElement aktuel)
    {
          if(aktuel!=foerste)
          {
              listeElement temp1= aktuel.naeste;
            listeElement temp2= aktuel.forrige;
            aktuel= temp2;
            aktuel.naeste= temp1;
        }
        else if(foerste==aktuel)
        {
            foerste= foerste.naeste;
        }
        else if(aktuel==sidste)
        {
            sidste= sidste.forrige;
        }
    }

Tak for hjælpen, håber du vil hjælpe igen en anden gang
mvh. Kube
Avatar billede disky Nybegynder
08. marts 2002 - 07:37 #10
Slev tak, du siger bare til :)

God weekend
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester