Usuwanie elementu z listy jednokierunkowej

0

Witam, mam problem z usuwaniem danego elementu z listy. W metodzie Usun_Z_Listy zwalniam pamięć z danego elementu za pomocą nowego wskaźnika tmp, ustawionego na początek listy , następnie przechodzi po elementach listy aż napotka element o żądanym elemencie i go usuwa. Tylko, że pamięć zostanie zwolniona ale każdy z elementów posiada wskaźnik do następnego elementu z listy. Czyli któryś z tych wskaźników(elementów) będzie pokazywać nadal na jakiś obszar pamięci . Co w takim razie powinienem zrobić (wydaję mi się, żeby ustawić wskaźnik na zero) .

Nie jestem pewien czy dobrze wytłumaczyłem mój problem.

 
#include <iostream>

using namespace std;
struct Element{
    Element():nastepny_element(0){};
    int val;
    Element* nastepny_element;
};
struct Lista
{
    Element* poczatek;  // DLaczego to
    Lista():poczatek(0){}
    void Dodaj_Element(int v);
    void Usun_Z_Listy(int liczba);
    void Wyswietl_liste();
};
void Lista::Dodaj_Element(int v)
{
    Element* nowy = new Element();
    nowy->val = v;

    if(poczatek==0)
    {
        poczatek=nowy;
    }
    else
    {
        Element* tmp = poczatek;
        while(tmp -> nastepny_element)
        {
             tmp= tmp -> nastepny_element;
        }
    tmp->nastepny_element=nowy;
    }
}
void Lista::Wyswietl_liste()
{
    cout << poczatek->val <<endl;

    Element* tmp = poczatek;
    while(tmp -> nastepny_element)
    {
        cout<<  tmp -> nastepny_element->val << endl;
        tmp = tmp -> nastepny_element;
    }
}

void Lista::Usun_Z_Listy(int liczba)
{
    int licznik = 1;
    Element* tmp = poczatek;
    while(tmp -> nastepny_element)
    {
        licznik++;
        tmp= tmp -> nastepny_element;

        if(licznik==liczba)
        {
            delete tmp;
        }
    }
}
int main()
{
    Lista lista;
    lista.Dodaj_Element(100);
    lista.Dodaj_Element(200);
    lista.Dodaj_Element(300);
    lista.Dodaj_Element(400);
    lista.Dodaj_Element(500);
    lista.Wyswietl_liste();
    cout << "Po usunieciu elementu" << endl;
    lista.Usun_Z_Listy(3);
    lista.Wyswietl_liste();
    return 0;
}

2
  1. Zapoznaj się z inkrementacją, bo jej nie rozumiesz: http://4programmers.net/Forum/1101404
  2. Nie używaj innego niż angielskie nazewnictwa: http://4programmers.net/Forum/1208091
  3. Dodając koniec listy bez trzymania wskaźnika na ostatni element pozbywasz się wszelkich zalet listy
  4. Czemu Element nie jest klasą wewnętrzną Listy? Zamierzasz gdzieś jeszcze tą klasę użyć?
  5. Usuwanie z listy wg wartości to jakiś chory pomysł.
  6. Wiadomo że nie będzie to usuwanie działać bo pierwszego elementu nawet nie sprawdzasz.
  7. Polecam coś na kształt:
#include <iostream>
using namespace std;

class List
  {
   private:
   struct Node
     {
      int value;
      Node *next;
      Node(int value,Node *next=0):value(value),next(next) {}
     };
   Node *head,*tail;
   public:
   List():head(0),tail(0) {}
   ostream &show(ostream &s)const { for(Node *i=head;i;i=i->next) s<<i->value<<' '; return s; }
   friend ostream &operator<<(ostream &s,const List &L) { return L.show(s); }
   void add(int value) { tail=(tail?tail->next:head)=new Node(value); }
   List &operator<<(int value) { add(value); return *this; }
   bool remove(unsigned pos);
  };
  
bool List::remove(unsigned pos)
  {
   Node **ptr=&head;
   while((pos--)&&(*ptr)) ptr=&((*ptr)->next);
   Node *tmp=*ptr;
   if(!tmp) return false;
   (*ptr)=tmp->next;
   delete tmp;
   return true;
  }

int main()
  {
   List lst;
   lst<<100<<200<<300<<400<<500;
   cout<<"Przed usunieciem elementu: "<<lst<<endl;
   lst.remove(2);
   cout<<"Po usunieciu elementu: "<<lst<<endl;
   return 0;
  }

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