Plik
Transkrypt
Plik
Wskaźniki, rekordy, listy Statyczne struktury danych ● Tablica – N-elementowa – Stała długość – Konieczność przechowywania rozmiaru Przechowywanie danych ● Pamięć składa się z komórek – Każda komórka posiada adres – Przykład: 0 5 10 50000 1 2 3 4 5 A l a \0 6 7 8 9 Pojęcie wskaźnika ● ● Wskaźnik rozumiemy jako „przyjazną” wersję adresu w pamięci. Przykład: Operacje na wskaźnikach ● Deklaracja wskaźnika: – ● int* jakasLiczba; Operator wyłuskania: – int a = 5; – int *wskaznik1; – *wskaznik1 = a; – int b; – b = *wskaznik1; Operacje na wskaźnikach cd ● ● Korzystanie z adresów: – int a = 5; – int* wskaznik2 = &a; – wypisz(*wskaznik2); – wypisz(wskaznik2); W przypadku tablic (w c++) nazwa tablicy jest wskaźnikiem do pierwszego elementu tablicy. Typ rekordowy ● ● Typ rekordowy jest strukturą danych, która przechowuje kilka zmiennych na raz. Przykładem jest wpis w książce telefonicznej: – Imię abonenta (string) – Nazwisko abonenta (string) – Nr kierunkowy (byte) – Nr abonenta (int) – Adres (string) Jak to wygląda w praktyce? Typ rekordowy - implementacja struct abonent { string imie; string nazwisko; byte nrKierunkowy; int nrAbonenta; string adres; } Typ rekordowy - przykład abonent ja; ja->imie = „Lukasz”; ja->nazwisko = „Chomatek”; ja->nrKierunkowy = 42; ja->nrAbonenta = 6439323; ja->adres = „Lodz”; wypisz(ja->adres); Uwagi do typów rekordowych ● ● ● Typy rekordowe można oczywiście przechowywać w tablicach: – abonent [ 100 ] ksiazkaTel; – wypisz(ksiazkaTel[50]->imie); Skoro ilość abonentów musi być stała, to w jaki sposób dodać nowego? Jak usunąć abonenta? Dynamiczne struktury danych - lista ● ● Lista jest to grupa połączonych ze sobą elementów: A skąd wiadomo, kiedy koniec? Lista cd. ● ● ● „Uziemienie” nazywa się w programowaniu null. Nie wiadomo na co pokazuje wskaźnik zaraz po zadeklarowaniu. Jeśli chcemy, żeby był „uziemiony” piszemy: – ● Wskaznik1 = null; I to chyba tyle :) Lista w praktyce... struct ElementListy { int wartosc; ElementListy* nastepny; } Jak zrobić listę, która jest na rysunku? ElementListy a,b,c; a->wartosc = 10; b->wartosc = 15; c->wartosc = 20; c->nastepny = null; b->nastepny = c; a->nastepny = b; Uwagi do listy: ● Każdą listę przygotowuje się tak samo: – Tworzy się typ (patrz wcześniej) – Element poprzedni powinien mieć wskazanie do następnego – Ostatni element powinien mieć wskazanie na następny element uziemione – Lista jako parametr do funkcji przekazywana jest przez nazwę ElementListy * nowaLista() { ElementListy * lista; lista = new ElementListy; lista->wartosc=0; lista->nastepny=NULL; return lista; } Przykład: Policzyć ilość elementów listy int dlugosc(ElementListy * lista) { int wynik = 0; ElementListy * aktualny = lista; while (aktualny != null) { wynik = wynik+1; aktualny = aktualny->nastepny; } return wynik; } Zadania: ● Policzyć ile jest elementów, których wartość jest mniejsza niż pewna zadana liczba – ● ● ● int ileElementow(ElementListy * lista, int szukanaWartosc) Dodać nowy element (na początku listy, na końcu listy, za elementem o podanym numerze) Usunąć element z listy(z końca listy, z początku listy, o podanym numerze, o podanej wartości) Posortować listę Zadania cd. ● Przechodząc listę maksymalnie raz, ustawić wskaźnik na jej środkowym elemencie.