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

Usuwanie wybranego elementu listy

Ostatnio zmodyfikowano 2018-05-19 15:01
Autor Wiadomość
jdkrrrrr
Temat założony przez niniejszego użytkownika
Usuwanie wybranego elementu listy
» 2018-05-18 22:36:35
Witam, potrzebuje napisać funkcję, która będzie usuwać element listy jednokierunkowej, który wyszukam na podstawie zmiennej wiek(czyli if(wsk->wiek==10)...usun ten element). Dodam, że dopiero uczę się list, więc proszę o możliwie łatwe do zrozumienia wytłumaczenie zagadnienia.

Mój dotychczasowy kod z funkcją dodawania:

C/C++
struct person
{
    person * next;
    string imie;
    int wiek;
};
person * head;
person * tmp;

void dodaj()
{
    tmp = new person;
    cout << "Podaj imie: ";
    cin >> tmp->imie;
    cout << "Podaj wiek: ";
    cin >> tmp->wiek;
    tmp->next = NULL;
    if( head == NULL )
         head = tmp;
    else
    {
        person * ptr = head;
        while( ptr->next )
             ptr = ptr->next;
       
        ptr->next = tmp;
        tmp->next = NULL;
    }
}
P-171173
pekfos
» 2018-05-18 22:49:28
Będzie prościej jak podasz, z czym masz problem. Usuwanie z listy wymaga tylko przestawienia wskaźników, upewnij się że algorytm jest poprawny dla usuwania elementu z początku, środka i końca listy.
P-171174
jdkrrrrr
Temat założony przez niniejszego użytkownika
» 2018-05-19 00:16:04
Problem jest taki, że nie wiem jak przestawić wskaźniki tak żeby to miało ręce i nogi.

Mój prototyp funkcji usun:
C/C++
void usun()
{
    person * wsk = head;
    if( wsk != NULL )
    {
        while( wsk != NULL )
        {
            if( wsk->wiek == 10 )
            {
                free( wsk );
            }
            wsk = wsk->next;
        }
    }
    else
         cout << "\nLista jest pusta\n";
   
}
P-171176
pekfos
» 2018-05-19 00:30:43
Problem jest taki, że nie wiem jak przestawić wskaźniki tak żeby to miało ręce i nogi.
W liście A -> B -> C, by usunąć B, wystarczy by A wskazywało na C.
P-171177
jdkrrrrr
Temat założony przez niniejszego użytkownika
» 2018-05-19 09:56:51
Wiem już jak usunąć szukany element gdy jest pierwszy lub ostatni na liście, jednak nie potrafię napisać kodu, który usuwałby szukany element pomiędzy pierwszym a ostatnim.

Kod:
C/C++
void usun()
{
    person * poprzedni = NULL;
    person * tmp;
    person * wsk = head;
    if( wsk == NULL )
    {
        cout << "\nLista jest pusta\n";
    }
    else
    {
        if( head->wiek == 10 )
        {
            tmp = head->next;
            delete head;
            head = tmp;
        }
        else
        {
            while( wsk->next )
            {
                poprzedni = wsk;
                wsk = wsk->next;
            }
            if( wsk->wiek == 10 )
            {
                poprzedni->next = NULL;
                delete wsk;
            }
        }
    }
}
P-171178
pekfos
» 2018-05-19 11:12:45
W liście jednokierunkowej usuwanie ze środka i końca realizuje ten sam algorytm.
P-171179
jdkrrrrr
Temat założony przez niniejszego użytkownika
» 2018-05-19 14:30:25
Problem rozwiązany, dziękuje za porady :)

Mam jeszcze jedno zagadnienie dotyczące funkcji dodaj. Ma działać tak, żeby każda nowa osoba była dodawana na 3 miejsce listy(gdy 2 poprzednie osoby są już dodane). Czyli jeżeli dodam czwartą osobę to zamieni się ona miejscami z trzecią osobą w liście.

 
P-171180
pekfos
» 2018-05-19 15:01:02
To szukaj ostatniego miejsca na liście, ale przechodząc przez maksymalnie 2 elementy. Dodanie w środek i na koniec w liście jednokierunkowej realizuje ten sam algorytm.
P-171181
« 1 »
  Strona 1 z 1