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

Dynamiczne zarządzanie pamięcią i książka telefoniczna

Ostatnio zmodyfikowano 2008-05-06 17:25
Autor Wiadomość
dawid93
Temat założony przez niniejszego użytkownika
Dynamiczne zarządzanie pamięcią i książka telefoniczna
» 2008-05-05 18:49:14
Witam. Nie do końca zrozumiałem lekcje o dynamicznym zarządzaniu pamięcią i chciałbym, żeby ktoś pokazał mi kod programu książka telefoniczna (chyba 19 lekcja), żebym mógł go spokojnie przeanalizować. jeżeli dostane kod i go nie zrozumiem będę pytał. Z góry dzięki za pomoc ;-)
P-650
DejaVu
» 2008-05-05 19:11:21
Książka telefoniczna, która jest w kursie nie wykorzystuje dynamicznego zarządzania pamięcią, więc nie istnieje program o który prosisz. Napisz czego nie zrozumiałeś z dynamicznego zarządzania pamięcią, bo to się by przydało do wprowadzenia ewentualnych poprawek w rozdziale.
P-651
dawid93
Temat założony przez niniejszego użytkownika
» 2008-05-05 19:22:57
Ale ja wiem, że ta książka nie jest na dynamicznym zarządzaniu pamięcią. Ja chciałbym ją przerobić, aby nie miała ograniczenia co do ilości osób.
Generalnie, nie za bardzo ogarniam tego zarządzania. Wiem, że potrzebne sa do tego wskaźniki, ale nie wiem jak na konkretnym przykładzie - książce telefonicznej do czego te wskaźniki "założyć" (nie wiem jak to nazwać). Wydaje mi się, że trzeba by założyć do struktury i za każdym dodaniem (usunięciem) osoby, dodawać (usuwać) nowe pola w strukturze. Ale nie mam pojęcia jak to zrobić. Dlatego proszę o kod przerobionej książki, żebym mógł przeanalizować go.

--------
wybacz źle sie wysłowiłem w poprzednim poście.
P-652
DejaVu
Dynamiczne zarządzanie danymi w programach
» 2008-05-05 20:26:22
[tutorial]

Dynamiczne zarządzanie danymi w programach

Jeśli chcesz dynamicznie zarządzać danymi, warto zapoznać się z takimi strukturami jak:
[li]stos[/li]
[li]lista jednokierunkowa[/li]
[li]lista dwukierunkowa[/li]
[li]drzewo binarne[/li]
Jeśli chcesz dobrze zrozumieć programowanie dynamiczne, powinieneś poczytać o tych strukturach danych i zaimplementować każdą z nich.

Jak zaimplementować listę jednokierunkową

Tworzymy strukturę do przechowywania danych

Aby utworzyć listę jednokierunkową, musimy utworzyć strukturę przechowującą jedną paczkę danych, która ma być powielana n razy.
C/C++
struct OsobaST
{
    string imie;
    string nazwisko;
    string telefon;
};
Załóżmy, że to jest nasza struktura bazowa. Aby utworzyć z tego listę jednokierunkową, musimy dodać do niej pole, które będzie wskazywało na jego następnika. Tak więc struktura dla listy jednokierunkowej może wyglądać np. tak:
C/C++
struct OsobaST
{
    string imie;
    string nazwisko;
    string telefon;
    OsobaST * nastepna;
};
Dodane pole to wskaźnik na następną osobę. Jeśli osoba istnieje wskaźnik zmiennej nastepna musi być różny od NULL (NULL to stała równa 0).

Tworzymy początek listy jednokierunkowej

Obecnie mamy utworzoną strukturę do przechowywania danych, jednak nie mamy jeszcze miejsca wskazującego na początek listy jednokierunkowej.
Utworzenie początku listy jednokierunkowej jest bardzo proste - wystarczy w programie napisać coś takiego:
OsobaST * poczatek = NULL;
Pamiętaj, że wskaźnik utworzony ma zawsze losową wartość i należy go zawsze ustawić, najlepiej w miejscu deklaracji wskaźnika.

Dodawanie elementu do listy jednokierunkowej

Jeśli chcesz dodać teraz element do listy jednokierunkowej, musisz dynamicznie zarezerwować pamięć, i dodać go do kolejki. Jeśli poczatek jest równy NULL, to nowo zarezerwowany obszar pamięci przypisujesz do zmiennej poczatek. W przeciwnym wypadku przechodzisz element po elemencie pętlą while (lub inną) i szukasz ostatniego elementu kolejki. Ostatni element kolejki to ten, którego wskaźnik nastepna jest równy NULL. Następnie przypisujesz nową osobę do ostatniej znalezionej.
C/C++
OsobaST * nowa = new OsobaST;
nowa->nastepna = NULL;
//ustawienie pozostałych pól struktury

if( poczatek == NULL )
{
    poczatek = nowa;
} else
{
    OsobaST * szukajOstatniej = poczatek;
    while( szukajOstatniej->nastepna != NULL )
    {
        szukajOstatniej = szukajOstatniej->nastepna;
    }
    szukajOstatniej->nastepna = nowa;
}

Usuwanie elementów i inne operacje na liście jednokierunkowej

Pozostałe operacje są równie proste jak wstawianie nowych elementów do kolejki. Polecam nie szukać gotowego rozwiązania tylko powalczyć kilka dni nad samodzielnym utworzeniem systemu do usuwania elementów i innych operacji - to pomoże Ci lepiej zrozumieć wskaźniki i ich wykorzystywanie.
[/tutorial]
P-653
dawid93
Temat założony przez niniejszego użytkownika
» 2008-05-06 16:38:00
Przeczytałem twój post kilka razy, później próbowałem wrzucić to do kodu, ale bez skutku...

Utworzenie początku listy jednokierunkowej jest bardzo proste - wystarczy w programie napisać coś takiego:
OsobaST * poczatek = NULL;

gdzie mam to wrzucić? zaraz po zdeklarowaniu struktury?


Jeśli chcesz dodać teraz element do listy jednokierunkowej, musisz dynamicznie zarezerwować pamięć, i dodać go do kolejki.
Ale jak to zarezerwować?


C/C++
OsobaST * nowa = new OsobaST;
nowa->nastepna = NULL;
//ustawienie pozostałych pól struktury

if( poczatek == NULL )
{
    poczatek = nowa;
} else
{
    OsobaST * szukajOstatniej = poczatek;
    while( szukajOstatniej->nastepna != NULL )
    {
        szukajOstatniej = szukajOstatniej->nastepna;
    }
    szukajOstatniej->nastepna = nowa;
}
Pozostałe pola struktury? Chodzi o ustawienie wskaźników na imie, nazwisko i telefon?

Pozostałe operacje są równie proste jak wstawianie nowych elementów do kolejki. Polecam nie szukać gotowego rozwiązania tylko powalczyć kilka dni nad samodzielnym utworzeniem systemu do usuwania elementów i innych operacji - to pomoże Ci lepiej zrozumieć wskaźniki i ich wykorzystywanie.

hehe obiecuje, że jak dowiem się jak dodawać to spróbuje przerobić edytowanie i usuwanie wpisów;)
P-655
DejaVu
» 2008-05-06 17:25:08
Jeśli nie wiesz jak dynamicznie przydzielić pamięć to znaczy, że nie czytałeś uważnie rozdziału: http://ddt.pl/kursy/?LessonId=111
/edit:
lub rozdział jest niejasno napisany - jeśli tak jest proszę o zgłaszanie uwag jak powinno być napisane coś, żeby było bardziej przystępne lub jakie fragmenty są niejasne i co w nich jest niejasne, żebym mógł je ewentualnie poprawić.
P-656
« 1 »
  Strona 1 z 1