Lista - usuwanie ogona.
Ostatnio zmodyfikowano 2009-05-31 16:34
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. #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; } |
|
WunM |
» 2009-05-27 09:31:29 Zapomniałeś o funkcji erase? |
|
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. |
|
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ąć ;/ ? |
|
DejaVu |
» 2009-05-27 10:39:52 void wezel::UsunOgon( wezel * & head ) { wezel * t; t = head; wezel * trelele = NULL; while( t->nastepny != NULL ) { trelele = t; t = t->nastepny; } if( trelele ) { trelele->nastepny = NULL; } else { head = NULL; } delete t; } |
|
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. |
|
DejaVu |
» 2009-05-27 15:11:56 Chyba nie rozumiesz sam tego co robi ten kod. Przemyśl parametry jakie przekazujesz do funkcji Dodaj. |
|
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: 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). |
|
« 1 » 2 |