Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

lista jednokierunkowa - usuwanie elementu z listy

Ostatnio zmodyfikowano 2016-05-19 05:13
Autor Wiadomość
locf
Temat założony przez niniejszego użytkownika
lista jednokierunkowa - usuwanie elementu z listy
» 2016-05-08 17:28:59
Cześć,
Mam takie pytanie co do takiej funkcji wykorzystywanej w listach. Chodzi mi o algorytm usuwania wybranego elementu listy jednokierunkowej


e
 - wskazanie elementu listy do usunięcia

C/C++
struct slistEl
{
    slistEl * next;
    typ_danych data;
};

C/C++
void l_remove( slistEl * & head, slistEl * e )
{
    slistEl * p;
   
    if( head == e ) l_pop_front( head );
    else
    {
        p = head;
        while( p->next != e ) p = p->next;
       
        p->next = e->next;
        delete e;
    }
}

Chodzi mi dokładnie o instrukcję
C/C++
if( head == e ) l_pop_front( head );


Czy to należy rozumieć tak:

Jeśli w polu
next
 zmiennej
head
 jest wskaźnik do pokazywania na pierwszy element listy i ten pierwszy element listy znajduje się pod adresem np. AAA oraz jeśli zmienna
e
 znajduje się również pod adresem AAA, to mamy prawdę w tym if-ie?
Innymi słowy: prawdę mam, gdy wskaźnik w zmiennej
head
 mówi: idź pod adres AAA, a jednocześnie zmienna
e
 leży również pod adresem AAA. Czy tak to należy rozumieć?
Bo nie do końca wiem, co tu jest porównywane.

I jeszcze nie jestem pewien jak to należy rozumieć:
C/C++
while( p->next != e ) p = p->next;


przechodź do następnego elementu listy, gdy wskaźnik w polu
next
 zmiennej
p
 jest różny od adresu, pod którym znajduje się zmienna
e
?
Czyli jeśli zmienna
e
 jest pod adresem AAA, to program powinien wykonywać instrukcję pętli dopóty, dopóki w polu
next
 zmiennej
p
 wskaźnik nie wskazuje na adres AAA, czyli NIE mówi: idź pod adres AAA ?
P-148039
carlosmay
» 2016-05-08 19:54:53
Bo nie do końca wiem, co tu jest porównywane.
Sprawdzenie czy przekazany element jest pierwszy z listy.

I jeszcze nie jestem pewien jak to należy rozumieć:
Sprawdź czy następny element nie jest tym do usunięcia ( p->next != e ), jeśli nie przejdź do następnego p = p->next.
P-148041
locf
Temat założony przez niniejszego użytkownika
» 2016-05-08 21:29:34
Dzięki, ale chodzi mi o ustalenie, co i jakie pola których elementów listy są porównywane, a nie "ogólnie", że chodzi o sprawdzanie, czy przekazany element jest pierwszy z listy.
P-148044
carlosmay
» 2016-05-09 00:39:12
chodzi mi o ustalenie, co i jakie pola których elementów listy są porównywane, a nie "ogólnie", że chodzi o sprawdzanie, czy przekazany element jest pierwszy z listy.
Tylko tym zajmuje się ( head == e ).

Funkcja przyjmuje:
- pierwszy argument, początek listy slistEl * & head,
- drugi argument, element do usunięcia slistEl * e.
Teraz porównywane są ich adresy. To już jest oczywiste, że jeśli głowa listy i element do usunięcia
mają ten sam adres, to do usunięcia jest głowa listy (a, że zdefiniowana jest już funkcja usuwająca
z początku listy, to ją wywołano).
P-148046
locf
Temat założony przez niniejszego użytkownika
» 2016-05-19 05:13:20
Dzięki !
P-148397
« 1 »
  Strona 1 z 1