logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak usunąć element o określonej wartości z listy dwukierunkowej w C?

screamoll 11 Cze 2013 18:45 3153 7
REKLAMA
  • #1 12406692
    screamoll
    Poziom 2  
    Posty: 2
    Mam nastepujące pytanie, mam czesc kodu, który usuwa i dodaje elementy do listy dwukierunkowej. Teraz chcialabym usunąc element, który ma okreslona wartosc i nie wiem jak sie zabrac za to.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 12407218
    Krzysztof Gustaw
    Poziom 23  
    Posty: 392
    Pomógł: 76
    Ocena: 31
    Witam!
    Rozwiązywałem ten problem wiele lat temu... Zależy to od tego, który usuwany element chcesz widzieć: jako bieżący, poprzedni czy następny, bowiem dla każdego przypadku trzeba inaczej podejść w zależności od tego, czy usuwany element jest pierwszym, ostatnim czy wewnątrz listy...
    A w Twoim programie przedstawionym jako całość nie zauważyłem zmiennej wskazującej na początek listy, jako zewnętrzną czy statyczną co znacznie utrudnia sprawę... Gdzie masz początek listy, który w przypadku listy pustej wskazuje jako NULL, przechowywany jako stałą? Jest to bowiem istotne dla Twojego problemu, musisz wiedzieć gdzie jest początek (lista jednokierunkowa) bądź jako położenie bieżące (lista cykliczna) a już na pewno jako lista dwukierunkowa (początek, koniec, położenie bieżące)
  • REKLAMA
  • #3 12407751
    screamoll
    Poziom 2  
    Posty: 2
    Hmm, na laboratoriach robiłam to tak, że ustawiony był wskaźnik na pierwszy element, a później jak potrzebowałam być na końcu listy, przeleciałam whilem po elementach na ostatni, nie miałam zmiennej na początek i koniec. Chyba hah, nie wiem dużo o programowaniu i tu jest problem.

    Mam jeszcze cześć kodu, który właśnie miał usuwać wskazany element, no ale nie działa.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #4 12410210
    LED5W
    Poziom 34  
    Posty: 2302
    Pomógł: 264
    Ocena: 162
    Masz błąd w pierwszym warunku pętli. Chyba jesteś świadoma, że ta funkcja szuka elementu o danej wartości (a nie wskazany element) tylko wstecz?
  • REKLAMA
  • #5 12411586
    Krzysztof Gustaw
    Poziom 23  
    Posty: 392
    Pomógł: 76
    Ocena: 31
    Witam!
    Kłania się tutaj sposób i kolejność opracowywania operatorów logicznych. W języku C są one opracowywane ZAWSZE od strony lewej do prawej i w przypadku określenia stanu dalsze opracowywanie operatorów jest wstrzymane. Przypatrz się swojej pętli while. u Ciebie wygląda tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Masz w niej dwa błędy:
    1 - wyrażenie (tmp->x = z) Powinien być operator przyrównania "==" a nie przypisania "=", zatem: (tmp->x == z)
    2 - Kolejność opracowywania argumentów wyrażenia logicznego. Najpierw jest opracowywane wyrażenie (tmp->x == z) a po nim (tmp != NULL) W przypadku tej kolejności zawsze jako pierwsze opracowywane jest wyrażenie (tmp->x == z) co w przypadku gdy tmp jest równe NULL to program Ci się wywali. Jeśli natomiast zamienisz je miejscami, czyli:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    to najpierw zostanie opracowane wyrażenie (tmp != NULL) i w przypadku gdy tmp == NULL dalsze opracowywanie zostaje wstrzymane i problem wywalania się programu masz za sobą.
    W dalszej części pętli while, zanim dokonasz przypisań musisz najpierw sprawdzić czy wskaźniki po lewej stronie nie mają przypadkiem wartości NULL bo Ci też program będzie się wywalać
    Pozdrowienia:
    KG
  • #6 12412018
    LED5W
    Poziom 34  
    Posty: 2302
    Pomógł: 264
    Ocena: 162
    Krzysztof Gustaw napisał:
    1 - wyrażenie (tmp->x = z) Powinien być operator przyrównania "==" a nie przypisania "=", zatem: (tmp->x == z)
    Nie, powinien być !=.

    Krzysztof Gustaw napisał:
    W dalszej części pętli while, zanim dokonasz przypisań musisz najpierw sprawdzić czy wskaźniki po lewej stronie nie mają przypadkiem wartości NULL bo Ci też program będzie się wywalać
    Nie musi. Może zrobić tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #7 12413989
    Krzysztof Gustaw
    Poziom 23  
    Posty: 392
    Pomógł: 76
    Ocena: 31
    Witam!
    Do Kolegi LED5W; Odnośnie cytatu nr 1 święta racja, pospiech jest wskazany tylko przy łapaniu pcheł :)
    A swoją drogą, zapomniałem dodać, że wspomniana zasada opracowywania wyrażeń logicznych uwzględnia również priorytet tychże...
    Co do pozostałej części... hmm... tyle koncepcji, ilu programistów razy 3 :)
    Ja osobiście sądziłem, że ten temat podejmie Koleżanka screamoll... bo generalnie, moim zamiarem było podać wędkę a nie rybkę...
    Ale cóż, jeśli obowiązuje studencka zasada 3Z, nie widzę sensu ciągnięcia dalej wątku...
  • #8 12417640
    LED5W
    Poziom 34  
    Posty: 2302
    Pomógł: 264
    Ocena: 162
    Krzysztof Gustaw napisał:
    Co do pozostałej części... hmm... tyle koncepcji, ilu programistów razy 3 :)
    Zgadza się. Tylko, że ja się czasami czepiam - w tym przypadku słówka musisz. ;)

    A te kilka linijek kodu myślę, że można uznać za rybkę z wędką. :D

Podsumowanie tematu

✨ W dyskusji poruszono problem usuwania elementów z listy dwukierunkowej w języku C. Użytkownik zadał pytanie dotyczące usunięcia elementu o określonej wartości, wskazując na trudności w implementacji. Odpowiedzi koncentrowały się na poprawności kodu, zwracając uwagę na błędy w operatorach logicznych oraz na konieczność posiadania wskaźnika do początku listy. Użytkownicy sugerowali poprawki w pętli while, aby uniknąć błędów związanych z dereferencją wskaźników oraz podali różne podejścia do usuwania elementów, w tym sprawdzenie, czy element istnieje w liście przed jego usunięciem.
Wygenerowane przez model językowy.
REKLAMA