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

Lista - usuwanie ogona.

Ostatnio zmodyfikowano 2009-05-31 16:34
Autor Wiadomość
nino
Temat założony przez niniejszego użytkownika
Lista - usuwanie ogona.
» 2009-05-27 08:38:53
Witam.

Mam problem z usunięciem ostatniego elementu. Mianowicie wprowadzam 4 dane i używam poniższej funkcji UsunOgon. Jednak po usunięciu dany element nie znika tylko wynosi 0. Co jest nie tak z funkcją?

A to cała implementacja.

C/C++
#include <iostream>
#include <conio.h>
#include <list>
using namespace std;

struct wezel
{
    int dana;
    wezel * nastepny;
   
    void Dodaj( wezel *& head, int liczba );
    void wezel::Wyswietl( wezel * & head );
    void wezel::UsunOgon( wezel * & head );
};



void wezel::Dodaj( wezel *& head, int liczba )
{
    wezel * t = new wezel;
    t->dana = liczba;
    t->nastepny = head;
    head = t;
}

void wezel::UsunOgon( wezel * & head )
{
    wezel * t;
    t = head;
   
    while( t->nastepny != NULL )
    {
        t = t->nastepny;
    }
    delete t;
}

void wezel::Wyswietl( wezel * & head )
{
   
    while( head != NULL )
    {
        cout << head->dana << " ";
        head = head->nastepny;
    }
}



int main()
{
    wezel k;
    wezel * head = NULL;
   
    int liczba;
   
    for( int i = 0; i < 4; i++ )
    {
        cin >> liczba;
        k.Dodaj( head, liczba );
    }
   
    k.UsunOgon( head );
    k.Wyswietl( head );
   
    getch();
    return 0;
}
P-7216
WunM
» 2009-05-27 09:31:29
Zapomniałeś o funkcji erase?
P-7218
DejaVu
» 2009-05-27 10:23:19
Dobrze, że program się nie wywala :) bo powinien. Usuwasz ostatni element - spoko. Ale co z węzłem, który wskazywał na niego? jest on nadal zinicjowany i wskazuje na blok pamięci, który został zwolniony słowem kluczowym delete.
P-7220
nino
Temat założony przez niniejszego użytkownika
» 2009-05-27 10:35:29
No właśnie i z tym mam problem. Robiłem już wiele kombinacji, ale program najczęściej padał.
Jak wtedy to usunąć ;/ ?
P-7221
DejaVu
» 2009-05-27 10:39:52
C/C++
void wezel::UsunOgon( wezel * & head )
{
    wezel * t;
    t = head;
    wezel * trelele = NULL;
   
    while( t->nastepny != NULL )
    {
        trelele = t;
        t = t->nastepny;
    } //while
    if( trelele )
    {
        trelele->nastepny = NULL;
    } else
    {
        head = NULL;
    } //else
    delete t;
}
P-7222
nino
Temat założony przez niniejszego użytkownika
» 2009-05-27 11:53:25
Super, działa.

Jeszcze jedno pytanie. Jak można z tej struktury utworzyć parę list.

W main napisałem:
wezel k, s;

i później stosowałem komendy np.
k.Dodaj.... lub s.Dodaj, ale dalej k i s są traktowane jako jedna lista.
P-7223
DejaVu
» 2009-05-27 15:11:56
Chyba nie rozumiesz sam tego co robi ten kod. Przemyśl parametry jakie przekazujesz do funkcji Dodaj.
P-7228
ziemianp
» 2009-05-29 18:33:13
Na Twoim miejscu spróbowałbym zrobić jakąś klasę, która zawierałaby w sobie taką strukturę danych jak Twój węzeł. Ale metody węzła przeniósłbym na listę.

Czyli np:

C/C++
class List
{
public: struct wezel
    {
        typ dana;
        wezel * nastepny;
    }
private:
    wezel * head;
public:
    List();
    void dodaj( typ ) { dodawanie w ę z ł a; }
    void usun() { usuwanie w ę z ł a; }
}

Teraz możesz w main używać klasy lista, a węzły będą tworzone dynamicznie w tej liście. I lepiej jest tak zrobić metody, żeby nie przejmować się w programie jaki jest wskaźnik na poprzedni czy następny węzeł, tylko po prostu dodawać daną - list.dodaj(dana).
P-7254
« 1 » 2
  Strona 1 z 2 Następna strona