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
Stránky: 1
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
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:
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
↑ 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
↑ patrissa:
8 - Seřadit seznam vzestupně metodou selectSort()- tuto metodu jsem vložila do ObousmernyInt
Offline
↑ 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
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
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
Stránky: 1