Lista jednokierunkowa - usuwanie elementu

0

Witam,
Proszę o jakieś łopatologiczne wytłumaczenie (może kawałek pseudokodu) w jaki sposób w liście jednokierunkowej usunąć ostatni element. Jestem początkujący. Po przejrzeniu całego internetu udało "mi " się zrobić coś takiego:

class element
{
  public:
         element *nastepny;
         int wartosc;
}; 


void dodaj(element *&root, int dana)
{
     element *list = new element();
     list->wartosc = dana;
     list->nastepny = NULL;
                    if(root==NULL)
                    {
                    root=list;           
                    }
                  else
                    {
                     element *tmp=root;
                             while(tmp->nastepny)
                             tmp=tmp->nastepny;
                             tmp->nastepny=list;
                    }
                 
}
void usun_pierwszy(element* &w)
{
      element *tmp=new element;
      if(w==NULL)
      {
         cout << "Lista jest pusta :( ";
      }
      else
      {
          tmp=w->nastepny;
          delete w;
          w=tmp;
      }
}
void usun_ostatni(element* &w)
{   

}

mam usuwanie pierwszego elementu ale nie wiem jak usunąć ostatni, tzn. wiem tyle, że trzeba ustawić wskaźnik przedostatniego elementu na NULL a ostatni usunąć ale w ogóle nie mam koncepcji jak to zrobić.
Dzięki za wszelaką pomoc [soczek]

0
natomiast napisał(a)

Po przejrzeniu całego internetu udało "mi " się zrobić coś takiego

Dzis padl temat (wznowienie) na tym forum

Wskaźniki. Listy jedno i dwukierunkowe.

poza tym pisanie czegos takiego

natomiast napisał(a)

Po przejrzeniu całego internetu

........................ nie wiem co mam powiedziec, co kolwiek bym chcial, to nie nadaje sie na forum a raczej na browrowa posmiewuche (che che no po prostu sie pograzam tekstem)

0

Witam,
Prosiłem o pomoc w problemie a nie o cynizm i wyśmiewanie się. Stwierdzenie "przejrzałem cały internet" jest oczywiście przenośnią w której miałem na myśli, ze przejrzałem już wiele stron na zadany temat ale nie trafiłem na zadowalające mnie wyjaśnienia. Nie chce nikogo obrażać ale jeżeli ktoś wierzy w to ze jakaś osoba jest w stanie przejrzeć internet to przepraszam ale jest idiotą. Zapoznałem się również z artykułem przedstawionym powyżej. Widać nie było to dla mnie wystarczające. Nie każdy jest wstanie napisać coś co wszyscy zrozumieją. Przepraszam jeszcze raz administratora forum za swoją wypowiedź ale naprawdę posty tego typu (j.w) powinny być usuwane. Jeżeli nie mam ochoty komuś pomagać to mu nie pomagam i tyle.
Pzdr

0

Znaczy w czym jest problem? Wiesz, jak usunąć, usunąć ostatni, a wskaźnik na następny ustawić na null, ewentualnie jak masz ogon listty jkoś oznaczony, to przenieść go na przedostatni element. To jest poprawne rozumoewanie. W czym więc jest problem? Jak nie masz koncepcji, skoro ją masz?
nie wiesz, jak znaleźć ostatni element? Zapamiętuj dwa ostatnie elementy które przejrzałeś, i sprawdzaj, czy ten najpóźniejszy ma wskaźnik na następny ustawiony na null. Znajdujesz, to masz wskaźnik na ostatni i przedostatni element. Cóż więc za prolem?

0

Problem jest w moim braku doświadczenia w programowaniu. "Zapamiętaj dwa ostatnie elementy" - OK tylko jak? Teorie znam i rozumiem . Po prostu nie wiem jak to zrealizować w języku programowania :-/ Byłbym wdzięczny za wyrozumiałość.

0

No a jak chciałbyś je zapamiętać? Najprościej i najlogiczniej w zmiennych, lokalnych na przykład.
Ot tak:

int *pierwszy, *drugi;
pierwszy = glowa_listy;
if (pierwszy.nastepny == null)
    //usuwasz pierwszy element
else
{
    drugi = pierwszy.nastepny;
    while (drugi.nastepny != null)
    {
         pierwszy = drugi;
         drugi = drugi.nastepny;
    }
    //przeiterowalismy przez wszystkie elementy w liscie, znaczy: drugi wskazuje na element ostatni, pierwszy wskazuje na element przedostatni i teraz usuwasz zgodnie z tym co powiedziałeś
}

Kod może być trochę z czapy, bo klepię to na uczelni godnej łąwce, siedząc na niewygodnej ławce, do tego dawno w c nie pisałem i może mi się coś mieszać, ale idea jest prosta i raczej na pewno poprawna ;)

0

Dzięki bardzo. Nawet jak nie działa poprawnie to mam już z czym poeksperymentować :-)

0

Czemu taka odpowiedz, bo za szybko sie ludzie poddaja ...

ponizej z komentarzem do usun_pierwszy oraz rozwiazane podobne do pako (da sie z pewnoscia ladniej napisac).

void usun_pierwszy(element* &w)
{
      element *tmp; // NIe trzeba tworzyc !! po co ? = new element;
      if(w==NULL)
      {
         cout << "Lista jest pusta :( ";
      }
      else
      {
         tmp = w->nastepny;
         delete w;
         w = tmp;
      }
}
void usun_ostatni(element* &w)
{   
	 
     if(w==NULL)
     {
         cout << "Lista jest pusta :( ";
     }
     else
     {
         element *tmp=w;
         element *poprzedni = NULL;
         //szukamy elementu ostatniego ale zapamietujemy tez poprzedni
         //jak tylko jeden to cala lista kasowana 
         while(tmp->nastepny)
        {
	poprzedni = tmp;
            tmp=tmp->nastepny;
        }
       if (poprzedni == NULL)
      {
             //lista z jednym elementem
	 delete w;
	 w = NULL;
       }
       else
       {
	 poprzedni->nastepny = NULL;
             delete tmp;
       }
   }

}

jescze komentarz, wpisalem z ciekawosci: lista jednokierunkowa c++ usun

i w 3 linku dostalem
http://eldoras.com/studia/algorytmy%20i%20struktury%20danych%20ii/1/1.pdf

gdzie jest funkcja removeLast, no tak ale trzeba przeczytac 11 stron .....

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