Jak usunąć element z listy dwukierunkowej?

0

Witam, otóż mam problem z usuwaniem elementu z listy dwukierunkowej. Struktura wygląda tak:

struct Lista{
        int element;
        Lista* Next;
        Lista* Prev;
    };

zaś sama funkcja usuwania dla listy jednokierunkowej wyglądałaby tak:

int UsunElement(Lista*& poczatkowy, int wartosc)
    {
        if(poczatkowy->element == wartosc)
        {
            Lista* StaryPoczatkowy = poczatkowy;
            poczatkowy = poczatkowy->Next;
            delete StaryPoczatkowy;
            return 1;
        }
        
        Lista* ObecnaLiczba = poczatkowy;
        while(ObecnaLiczba->Next && wartosc > ObecnaLiczba->Next->element)
        {
            ObecnaLiczba = ObecnaLiczba->Next;
        }
        if(ObecnaLiczba->Next->element == wartosc)
        {
            Lista* OldNext = ObecnaLiczba->Next;
            ObecnaLiczba->Next = ObecnaLiczba->Next->Next;
            delete OldNext;
            return 1;
        }
        return 0;
    }

Lecz nie wiem jak to zmienić, aby działało na liście dwukierunkowej.

0
  1. Znajdź element do wywalenia i go zapamiętaj.
  2. Połącz jego poprzednika z następnikiem (biorąc tu pod uwagę sytuacje usuwania głowy / ogona!)
  3. Zwolnij pamięć z tego znalezionego elementu.
0

Mylisz list z elementem, dla tego masz tak skomplikowane.
Jak sobie pościelisz tak się wyśpisz. Ja tu pościeliłem wygodnie i zobacz wszystko krótko i elegancko:

struct Node
  {
   int Value;
   Node *next,*prev;
  };
struct List
  {
   Node *head,*tail;
  };

bool DeleteNode(List &L,Node *node)
  {
   (node->next?node->next->prev:L.tail)=node->prev;
   (node->prev?node->prev->next:L.head)=node->next;
   delete node;
   return true;
  }

bool DeleteNodeByValue(List &L,int Value)
  {
   for(Node *i=L.head;i;i=i->next) if(i->Value==Value) return DeleteNode(L,i);
   return false;
  }

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