Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 08. 05. 2012 22:01

patrissa
Zelenáč
Příspěvky: 10
Reputace:   
 

Java-Obousměrný seznam

Zdravím, našla by se dobrá duše co mi poradí s úkolem?
Zadání: Sestavte program, ve kterém bude vygenerováno n celých čísel, každé vygenerované číslo
vypište na obrazovku a zároveň jej uložte do obousměrně zřetězeného spojového seznamu.
Obsah seznamu vypište na obrazovku do jednoho řádku.-----Po sem to mám
Ale dál se mi to už hroutí!!!
Pak nabídněte menu:
1 - Přidat do seznamu na konec
2 - Přidat do seznamu na začátek
3 - Přidat za definovaný prvek
4 - Přidat před definovaný prvek
5 - Odebrat první prvek v seznamu
6 - Odebrat poslední prvek v seznamu
7 - Odebrat definovaný prvek v seznamu
8 - Seřadit seznam vzestupně metodou selectSort()
9 - Konec programu
Číslo, které chceme do seznamu vložit, budeme zadávat z klávesnice. Po každé změně
seznamu dojde automaticky k výpisu seznamu na obrazovku a k návratu na výběr
operace.

Všechny metody už mám sestavené v jiné třídě, ale nedaří se mi to celé dát do kupy :(

Offline

  • (téma jako vyřešené označil(a) patrissa)

#2 09. 05. 2012 11:18 — Editoval Jaa(c) (09. 05. 2012 11:20)

Jaa(c)
Zelenáč
Příspěvky: 13
Reputace:   
 

Re: Java-Obousměrný seznam

Jak můžeš mít ty metody v jiné třídě? :)

Předpokládám, že účelem úkolu je implementovat ten seznam a ne použít nějaké hotový?

Obousměrný seznam je poměrně jednoduchý, prostě nějaké třída, která bude mít uzel seznamu jako vnitřní třídu... Každý uzel bude mít ukazatel na předchozí a následující uzel... A seznam drží jenom ukazatel na první prvek, případně na poslední... Ty jednotlivé operace jsou pak už jenom o hraní s těmi ukazateli...

Jen tak z hlavy to může vypadat takhle:

Code:

public class DLinikedList {
    Node first;
    Node last;

    public DLinikedList() {
        first = null;
    }

    //Vlozi prvek na konec
    public void insert(int i) {
        Node n = new Node(i);
        if(first==null) {
             first = n;
             last = n;
        }
        else {
            last.next=n;
            last.next.prev = last;
            last = n;
        }
    }

...

    private class Node {
        protected int value;
        protected Node next;
        protected Node prev;

        public Node(int value) {
            this.value = value;
        }
    }

}

Offline

 

#3 09. 05. 2012 12:30

patrissa
Zelenáč
Příspěvky: 10
Reputace:   
 

Re: Java-Obousměrný seznam

↑ Jaa(c):
Takto je to v zadání, to je konec, ten jsem tady nedala :)
Upřesnění:
Při volbě 3 a 4 se objeví dotaz, za (před) který prvek budeme vkládat - zadávat budeme
hodnotu prvku (ne jeho pořadí).
Při volbě 7 se objeví dotaz, který prvek budeme odebírat – zadávat budeme hodnotu prvku
(ne jeho pořadí).
POZOR!
Při všech operacích se spojovým seznamem nezapomeňte ošetřit situaci, kdy spojový seznam
je prázdný, pozor dejte také na situaci, kdy v seznamu je pouze 1 prvek.
Využijte metody z třídy ObousmernyInt !!!

Všechno se mi to plete :(

Offline

 

#4 09. 05. 2012 12:31

patrissa
Zelenáč
Příspěvky: 10
Reputace:   
 

Re: Java-Obousměrný seznam

↑ patrissa:
8 - Seřadit seznam vzestupně metodou selectSort()-  tuto metodu jsem vložila do ObousmernyInt

Offline

 

#5 09. 05. 2012 15:26

Jaa(c)
Zelenáč
Příspěvky: 13
Reputace:   
 

Re: Java-Obousměrný seznam

patrissa napsal(a):

Využijte metody z třídy ObousmernyInt !!!

Tak to ti ale těžko někdo pomůže, když tuhle třídu nemáme :)

Offline

 

#6 09. 05. 2012 18:45

patrissa
Zelenáč
Příspěvky: 10
Reputace:   
 

Re: Java-Obousměrný seznam

↑ Jaa(c):
public class ObousmernyInt {
    Prvek prvni, posledni;
   
    ObousmernyInt (){
        prvni = null;
        posledni = null;
    }
   
    void vlozPrvni(int h){
        Prvek p = new Prvek(h);
        prvni = p;
        posledni = p;
    }

    void pridejNaKonec(int h){
        Prvek p = new Prvek(h);   
        p.predch = posledni;
        posledni.dalsi = p;
        posledni = p;
    }

    void pridejNaZacatek(int h){
        Prvek p = new Prvek(h);   
        p.dalsi = prvni;
        prvni.predch = p;
        prvni = p;   
    }
   
    int odeberPrvni(int h){
         h = prvni.hodnota;
        prvni = prvni.dalsi;
        prvni.predch = null;
        return h;   
    }

    int odeberPosledni(){
        int h = posledni.hodnota;
        posledni = posledni.predch;
        posledni.dalsi = null;
        return h;
    }
   
    void vypisOdZacatku(){
        Prvek pom;
        pom = prvni;
        while(pom != null){
            System.out.print(pom.hodnota+" ");
            pom = pom.dalsi;
        }
        System.out.println();
    }       
   
    void vypisOdKonce(){
        Prvek pom;
        pom = posledni;
        while(pom != null){
            System.out.print(pom.hodnota+" ");
            pom = pom.predch;
        }
        System.out.println();   
    }
   
    void odstranCislo(int h){
        Prvek pom = prvni;
        while (pom != null && pom.hodnota != h  ){
            pom = pom.dalsi;
        }
        if (pom == null) System.out.println("cislo neni v seznamu ");
            else if (pom == prvni) odeberPrvni(h);
                else if (pom == posledni) odeberPosledni();
                    else {
                        Prvek p1 = pom.predch;
                        Prvek p2 = pom.dalsi;
                        p1.dalsi = p2;
                          p2.predch = p1;
                          }
    }
   
    void zdvojeniPrvku(){
        Prvek pom = prvni;
        while (pom != null){           
            if (pom == posledni) {
                        pridejNaKonec(pom.hodnota);
                        pom = null;
                        }
            else {
                    Prvek novy = new Prvek(pom.hodnota);
                    novy.dalsi = pom.dalsi;
                      novy.predch = pom;
                      pom.dalsi.predch = novy;
                      pom.dalsi = novy;
                      pom = novy.dalsi;
                }
        }
   
}
void selectSort(ObousmernyInt seznam) {           
        Prvek pom = seznam.prvni;
        while (pom != null) {
            Prvek minimum = pom;
            Prvek prv = pom.dalsi;
            while (prv != null) {
                if (prv.hodnota < minimum.hodnota) minimum = prv;
                prv = prv.dalsi;
            }
            int h = minimum.hodnota;
            minimum.hodnota = pom.hodnota;
            pom.hodnota = h;

            pom = pom.dalsi;
        }
    }
}

Offline

 

#7 09. 05. 2012 19:19 — Editoval Jaa(c) (09. 05. 2012 19:21)

Jaa(c)
Zelenáč
Příspěvky: 13
Reputace:   
 

Re: Java-Obousměrný seznam

No ale dyk to už je komplet hotovej ten seznam.. Takže ty ho musíš jenom použít, nic víc. Nejjednodušší metoda je udělat nějakej switch, kde budeš číst ty jednotlivý volby a volat na tom seznamu ty metody

Code:

ObousmernyInt seznam = .... //nová instance
...
boolean pokracovat = true;
do {
  System.out.println("zadejte volbu z menu....");
  int num = new Scanner(System.in).nextInt();
  switch(num) {
    case 1:
       System.out.print("jaké číslo chcete přidat? ");
       int cislo = new Scanner(System.in).nextInt();
       seznam.pridejNaKonec(cislo);
       break;

 ...

    case 8:
       selectSort(seznam);
       break;

    case 9:
       pokracovat = false;
       System.out.println("konec programu");
       break;

    default:
       System.out.println("špatná volba");
       break;
  }
} while(pokracovat);

Offline

 

#8 09. 05. 2012 19:28

patrissa
Zelenáč
Příspěvky: 10
Reputace:   
 

Re: Java-Obousměrný seznam

↑ Jaa(c):
Aháa už mi svitlo :)...právě v tom switchi jsem to celé dokonila...volala jsem ty metody špatně.
teď se mi to až tak složité nezdá, díky moc :)

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson