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.