Lista dwukierunkowa.

0

Witam.

Mam do napisana następujący program.

Napisz program przetwarzający bazę danych jako listę dwukierunkową . Baza zawiera dane o samochodach. Auto , to jeden rekord o następujących polach: jednym z nich jest NR_SILNIKA.

Problem, którego nie mogę rozwiązać to metoda która dodaje auta w porządku rosnącym według pola NR_SILNIKA.

Jest to metoda dodaj kolejny element.

0
barslo napisał(a):

Problem, którego nie mogę rozwiązać to metoda która dodaje auta w porządku rosnącym według pola NR_SILNIKA.

Jak wyglądają u Ciebie metody :
ustawPoprzedni
ustawNastepny
?

Skopiuj all kod

EDIT:
Co do samego przeszukiwania i wstawiania:
Kod

Element iterujacy = poczatek;
boolean wstawiono=false
while (iterujacy != null && wstawiono==false) { //gdy list nie jest pusta
    if (nowy.NrSilnika > iterujacy.nrSilnika) { 
         iterujacy = iterujacy.pobierzNastepny();
    }
    else { // gdy nr nowego silnika mniejszy 
        if (iterujacy == poczatek) { //sprawdz czy jest to pierwszy element  z listy a jezeli tak to
            nowy.ustawNastepny(iterujacy); // nowy ma wskazywac na "stary pierwszy element"
            iterujacy.ustawPoprzedni(nowy); // "stary pierwszy" ma wskazywac na "pierwszy (nowy) " element
            poczatek = nowy; 
        }
        else {
            nowy.ustawNastepny(iterujacy);
            nowy.ustawPoprzedni(iterujacy.pobierzPoprzedni());
            iterujacy.pobierzPoprzedni().ustawNastepny(nowy);
            iterujacy.ustawPoprzedni(nowy);
         }
        wstawiono=true;
    }
    if(wstawiono==false){ // przeszliśmy całą listę i nie wstawiliśmy (najwiekszy numer silnika)
         koniec.ustawNastepny(nowy);
         nowy.ustawPoprzedni(koniec);
         koniec = nowy
    }
}

}
}




 
0

Być może dlatego, że zapomniałem dodać powiększania listy o 1 w metodzie wyszukującej ;p
Dorzuć jeszcze sprawdzanie listy pustej nad whilem i pokaż kod w razie gdyby coś dalej nie działało

EDIT:
Wydaje mi się, żew podwójnych listach nie ma metody typu "dodajPierwszy";
"dodajKolejny" (czyli po prostu "dodaj" ) wrzuci Ci spokojnie element do pustej listy.

0

Twoja Lista nie jest dobrze zaprojektowana. Z zewnątrz powinna wyglądać z grubsza tak:

class Lista
{
	Dodaj()
	Usuń()
	Wyświetl()
}

Metody typu dodajPierwszy czy dodajKolejnyElement powinny być prywatne, to jest problem List żeby dodać poprawnie element.

public void DodajElement()
{
	if ( this.Pusta() )
		dodajPierwszyElement()
	else
		dodajKolejnyElement()
}

Lista.dodajAuto() też mi się nie podoba, czy jesteś pewien że metody tego typu powinny być w Liście? Jak na moje Lista powinna tylko i wyłącznie przechowywać Samochody, a nie jest tworzyć. I jeszcze jedno paskudne zagranie...

        public void dodajPierwszy(){
                if(czyPusta()){
                        Element nowy = new Element(dodajAuto());
                        poczatek = nowy;
                        koniec   = nowy;
                        rozmiarListy++;
                        //System.out.print("\nNumer silnika: "+poczatek.wezWartosc().NR_SILNIKA+"\n");
                }
        }

To jest bardzo, ale to bardzo brzydki kod... Jeżeli ktoś wywołuje niepustą listę, to co wtedy? Widać, że wywołanie tej metody, gdy lista zawiera cokolwiek jest BŁĘDEM, ale Ty tego błędu:

  • nie obsługujesz
  • nie informujesz wywołującego

Dorzuć else w którym rzucisz wyjątkiem. Taki kod często kończy się tym, że przez godzinę siedzisz i się zastanawiasz "czemu to nie działa pomimo że nie ma żadnego błędu?". Niektóre metody NIE POTRAFIĄ obsłużyć błędu i wtedy powinny go przekazać wyżej. To trochę jakbyś miał "błędoodporną" metodę która ma policzyć pierwiastek kwadratowy

if ( argument < 0 )
   return 0;
....

Niby fajnie, bo się nie wysypie na nieprawidłowych argumentach... z drugiej nie zadziała poprawnie, ani nikogo nie poinformuje o błędnym użyciu. Miłego debuggingu...

EDIT:
Co do samego błędu, to pewnie źle dodajesz. Masz elementy:
A, B,C, E

I chcesz dodać D = bieżący.
Musisz znaleźć element za którym chcesz dodać czyli C = poprzedni, i potrzebujesz znaleźć ten który obecnie jest za C czyli następny = C.WeźNastępny() = E.

No i teraz bierzesz:
bieżący.UstawPoprzedni( poprzedni )
bieżący.UstawNastepny(nastepny)
poprzedni.UstawNastepny(bieżący)
następny.UstawPoprzedni(bieżący).

0

Oki dzięki fallon trochę musiałem dostosować swoje metody i ten kod co mi podałeś działa, jednakże mało mi to daję bo nie rozumiem zasady dodawania tych elementów:( Da się to jakoś łopatologicznie wytłumaczyć ?:)

0

W komenatrzach w kodzie masz opis, Zenek1999 też Ci opisał działanie.
Może obrazek pomoże:
http://pldocs.docdat.com/pars_docs/refs/15/14646/14646_html_m520907a8.gif
Ten przekreślony obiekt to to, co chcesz wstawić.
Najpierw strzałka z przekreślonego obiektu do następnego ( czyli nowy.ustawNastepny(stary)) itd

0

O dzięki obrazek wyjaśnił mi dokładnie o co kaman :P

0 użytkowników online, w tym zalogowanych: 0, gości: 0