Temat: Dynamiczne liniowe struktury danych - stos, kolejka, lista. 1. Wady i zalety struktury tablicy

Podobne dokumenty
Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

E S - uniwersum struktury stosu

DYNAMICZNE PRZYDZIELANIE PAMIECI

Temat: Liniowe uporzdkowane struktury danych: stos, kolejka. Specyfikacja, przykładowe implementacje i zastosowania. Struktura słownika.

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Podstawy programowania komputerów

Dynamiczne struktury danych

Wskaźniki. Programowanie Proceduralne 1

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

ZASADY PROGRAMOWANIA KOMPUTERÓW

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Języki i metodyka programowania. Wskaźniki i tablice.

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Temat: Struktury danych do reprezentacji grafów. Wybrane algorytmy grafowe.

Podstawy programowania w języku C++

Stałe, tablice dynamiczne i wielowymiarowe

Wskaźniki w C. Anna Gogolińska

Powyższe wyrażenie alokuje 200 lub 400 w zależności od rozmiaru int w danym systemie. Wskaźnik wskazuje na adres pierwszego bajtu pamięci.

Programowanie w języku C++

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

Struktury. Przykład W8_1

KURS C/C++ WYKŁAD 6. Wskaźniki

Programowanie i struktury danych 1 / 44

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Sposoby przekazywania parametrów w metodach.

Laboratorium 6: Dynamiczny przydział pamięci. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Tablice, funkcje - wprowadzenie

Podstawy programowania w języku C++

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Struktury czyli rekordy w C/C++

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Wskaźniki. Informatyka

Kiedy potrzebne. Struktura (rekord) Struktura w języku C# Tablice struktur. struktura, kolekcja

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

INFORMATYKA W SZKOLE. Podyplomowe Studia Pedagogiczne. Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227

Uzupełnienie dot. przekazywania argumentów

Struktury dynamiczne

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Algorytmy i Struktury Danych.

Język ANSI C tablice wielowymiarowe

KOLEJKA (QUEUE) (lista fifo first in, first out)

Proces tworzenia programu:

Globalne / Lokalne. Wykład 15. Podstawy programowania (język C) Zmienne globalne / lokalne (1) Zmienne globalne / lokalne (2)

Lab 9 Podstawy Programowania

Struktura danych. Sposób uporządkowania informacji w komputerze. Na strukturach danych operują algorytmy. Przykładowe struktury danych:

Algorytmy i język C++

Algorytmy i Struktury Danych.

Algorytmy i Struktury Danych.

Język ANSI C. część 11. Jarosław Gramacki Instytut Informatyki i Elektroniki


Zmienne, stałe i operatory

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

int tab_a [ 2 ] [ 3 ];

Podstawy programowania C. dr. Krystyna Łapin

Podstawy programowania w języku C++

Spis treści WSKAŹNIKI. DYNAMICZNY PRZYDZIAŁ PAMIĘCI W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

Typy wyliczeniowe Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Wykład 6_1 Abstrakcyjne typy danych stos Realizacja tablicowa i za pomocą rekurencyjnych typów danych

Programowanie obiektowe

ALGORYTMY I STRUKTURY DANYCH

dr inż. Paweł Myszkowski Wykład nr 8 ( )

Podstawy programowania w języku C++

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Struktury - wprowadzenie

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Dynamiczny przydział pamięci (język C) Dynamiczne struktury danych. Sortowanie. Klasyfikacja algorytmów sortowania. Algorytmy sortowania

PARADYGMATY PROGRAMOWANIA Wykład 4

Informatyka. Wy-03 Dynamiczna alokacja pamięci, wyjątki. mgr inż. Krzysztof Kołodziejczyk

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Etap 2 - Budowa interfejsu. typedef struct ELEMENT* stos; struct ELEMENT { dane Dane; stos Nastepny; }; struct kolejka { stos Poczatek, Koniec; };

dynamiczny przydział pamięci calloc() memset() memcpy( ) (wskaźniki!! )

Spis treści JĘZYK C - WSKAŹNIKI, DYNAMICZNY PRZYDZIAŁ PAMIĘCI. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

Spis treści WSKAŹNIKI. DYNAMICZNY PRZYDZIAŁ PAMIĘCI W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

Wstęp do programowania

KURS C/C++ WYKŁAD 8. Deklaracja funkcji informuje komplilator jaką wartość funkcja będzie zwracała i jakiego typu są jej argumenty.

Funkcja (podprogram) void

Programowanie i struktury danych

Podstawy informatyki 2

Struktura danych. Sposób uporządkowania informacji w komputerze. Na strukturach danych operują algorytmy. Przykładowe struktury danych:

1. Klasa typu sealed. Przykład 1. sealed class Standard{ class NowyStandard:Standard{ // błd!!!

Wskaźniki. Przemysław Gawroński D-10, p Wykład 1. (Wykład 1) Wskaźniki / 9

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Tablice, funkcje, wskaźniki - wprowadzenie

Wstęp do programowania 1

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.

Podstawy informatyki. Wykład nr 1 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

Wstęp do programowania

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)

Transkrypt:

Temat: Dynamiczne liniowe struktury danych - stos, kolejka, lista. 1. Wady i zalety struktury tablicy Wady ograniczony rozmiar maksymalny konieczno okrelenia stałego rozmiaru tablicy statyczna alokacja Zalety prosty indeksowy dostp do elementów tablicy 2. Deklaracja wskanika. Alokacja zmiennych dynamicznych a)rodzaje pamici uywanej w programach Pami komputera, dostpna dla programu, dzieli si na cztery obszary: kod programu, dane statyczne ( np. stałe i zmienne globalne programu), dane automatyczne (zmienne lokalne funkcji - tworzone i usuwane automatycznie przez kompilator) tzw. STOS (ang. stack) dane dynamiczne (zmienne, które mona tworzy i usuwa w dowolnym momencie pracy programu) w pamici wolnej komputera tzw. STERTA (ang. heap) Zmienne dynamiczne s to zmienne tworzone przez programist w pamici wolnej komputera (na stercie) dostp do takiej zmiennej moliwy jest jedynie poprzez jej adres w pamici (przechowywany w zmiennej wskanikowej). 1

b) Funkcje przydziału i zwalniania pamici W jzyku C do dynamicznego przydzielania pamici (tworzenia zmiennych dynamicznych) słu specjalne funkcje z biblioteki < alloc.h > albo <stdlib.h>. void malloc( size_t rozmiar ); // przydział bloku o zadanej wielkoci void calloc( size_t il_elementow, size_t rozmiar); // przydział // pamici dla tablicy dynamicznej void free( void wskaznik); // zwolnienie wskazywanego obszaru unsigned coreleft( void ); // sprawdzenie wolnego miejsca na stercie Przykład 1 // przydział i zwolnienie pamici na stercie int main( ) int wsk; // zmienna wskanikowa do zapamitania // adresu liczby int int x=5; wsk = (int ) malloc( sizeof(int) ); // przydzielenie pamici if( wsk == ) printf( Błd przydziału pamici ); else wsk = 10; // przykładowe operacje na dynamicznej liczbie wsk = 2; printf( %d, wsk ); scanf( %d, wsk ); free( wsk ); // zwolnienie pamici // dane spod wskanika wsk ju nie s dostpne, a 2

return 0; // dane ze zmiennej x s w dalszym cigu widoczne wsk x Stack (stos) Heap (sterta) Przykład 2 // tablica dynamiczna int rozmiar_tablicy; double T; printf( Ile liczb chcesz wprowadzi: ); scanf( %d, &rozmiar_tablicy ); if( T = (double ) calloc( rozmiar_tablicy, sizeof(double) ) ) // przydział pamici dla tablicy dynamicznej for( int i = 0; i < rozmiar_tablicy, i++ ); ( T+i ) = i*2; // albo T[ i ] =i*2; free(t); // zwolnienie pamici przeznaczonej na tablic 3

Przykład 3 // struktura dynamiczna struct Osoba char nazwisko[30]; char imie[]; float zarobki; ; Osoba wsk_osoby; wsk_osoby = (Osoba ) malloc( sizeof(osoba) ); // przydział pamici dla danych typu Osoba, // dane s dostpne przez wskanik wsk_osoby if( wsk_osoby ) // if( wsk_osoby!= ) printf( Podaj nazwisko: ); gets(wsk_osoby > nazwisko ); printf( Podaj imie: ); gets(wsk_osoby > imie); printf( Podaj zarobki: ); scanf( %f,&(wsk_osoby > zarobki));... wsk_osoby->zarobki+=100.50;... free( wsk_osoby ); // zwolnienie pamici przeznaczonej // dla danych typu Osoba Jeeli pod wskanikiem zapamitana jest struktura, to dostp do jej pól jest moliwy przez uycie operatora -> 4

Przykład 4 //dynamiczna tablica struktur int rozmiar_tablicy; Osoba T; printf( Ile liczb chcesz wprowadzi: ); scanf( %d, &rozmiar_tablicy ); T = (Osoba ) calloc( rozmiar_tablicy, sizeof(osoba)); // przydział pamici dla tablicy dynamicznej if( T == ) printf( Błd przydziału pamici ); else for( int i = 0; i < rozmiar_tablicy, i++ ); printf( Podaj nazwisko: ); gets(( T+i ) > nazwisko ); // albo gets(t[i].nazwisko); printf( Podaj imie: ); gets((t+i)->imie); // albo gets(t[i].imie); printf( Podaj zarobki: ); scanf( %f,&((t+i)->zarobki)); // albo scanf( %f,&t[i].zarobki); free( T ); // zwolnienie pamici przeznaczonej dla tablicy // dynamiczne 5

3. Stos Stos to struktura umoliwiajca wstawianie i usuwanie danych dostpnych jedynie w tzw. wierzchołku stosu. W wierzchołku stosu znajduj si zawsze dane, które zostały wstawione do stosu w trakcie ostatnio wykonanej operacji wstawiania. a) Deklaracja typu definiujcego element struktury stosu struct Element typ_danych dane; // typ danych przechowywanych w stosie Element *nastepny; // adres na nastpny element stosu ; W dalszej czci wykładu bdziemy dla uproszczenia zakładali, e przechowujemy w strukturze liczby całkowite (typ_danych=int) b) Operacja push wstawiania do stosu Element *push(element *S, int d) Przed wywołaniem push(s, d) Po wywołaniu push(s, d) S 16 dane nastepny S d 16 6

Element *push(element *S, int d) Element *temp; temp=s; S=(Element *)malloc(sizeof(element)); S->dane=d; S->nastepny=temp; return S; c) Operacja pop usuwania ze stosu Element *pop(element *S) Przed wywołaniem pop(s) S 16 dane nastepny Po wywołaniu pop(s) S 7

Element *pop(element *S) Element *temp; if (S!=) temp=s->nastepny; free(s); S=temp; return S; d) Operacja top zwracajca dane przechowywane w wierzchołku stosu int top(element *S) return S->dane; Uwaga!!! Operacja top powinna by wywołana tylko wtedy, gdy stos jest niepusty e) Operacja empty sprawdzajca, czy stos jest niepusty int empty(element *S) if (S==) return 1; else return 0;

Przykład 5 // drukowanie liczb ze stosu z jednoczesnym jego kasowaniem Element *drukuj_i_usun(element *S) while (!empty(s)) printf( %d\n, top(s)); S=pop(S); return S; 4. Kolejka Kolejka, to struktura w której mona wstawi element za tym, który trafił do struktury jako ostatni, a usuwa ten, który został wstawiony jako pierwszy. a) Deklaracja typu definiujcego element struktury kolejki struct Element typ_danych dane; // typ danych przechowywanych w stosie Element *nastepny; // adres na nastpny element stosu ; struct Kolejka Element *first, *last; W dalszej czci wykładu bdziemy dla uproszczenia zakładali, e przechowujemy w strukturze liczby całkowite (typ_danych=int) 9

b) Operacja in wstawiania do kolejki Kolejka in(kolejka Q, int d ) Q Przed wywołaniem in(q, d) Po wywołaniu in(q, d) first last 16 dane nastepny Q first last 16 d Kolejka in(kolejka Q, int d) Element *temp; temp=q.last; Q.last=(Element *)malloc(sizeof(element)); Q.last->dane=d; Q.last->nastepny=; if (temp!=) temp->nastepny=q.last; else Q.first=Q.last; return Q; 10

c) Operacja out usuwania z kolejki Kolejka out(kolejka Q) Q Przed wywołaniem out(q) first last 16 dane nastepny Q Po wywołaniu out(q) first last Kolejka out(kolejka Q) Element *temp; if (Q.first!=) temp = Q.first->nastepny; free(q.first); Q.first = temp; if (Q.first==) Q.last=; return Q; 11

d)operacja first zwracajca dane przechowywane w pierwszym elemencie kolejki int first(kolejka Q) return Q.first->dane; Uwaga!!! Operacja first powinna by wywołana tylko wtedy, gdy kolejka jest niepusta e)operacja empty sprawdzajca, czy kolejka jest niepusta int empty(kolejka Q) if (Q.first==) return 1; else return 0; Przykład 6 // wyznaczanie sumy liczb zapamitanych w kolejce z jednoczesnym // kasowaniem kolejki long sumuj_i_usun(kolejka Q) long suma=0; while (!empty(q)) suma+= first(q); Q=out(Q); return suma; 12

5. Lista Lista jest struktur, w której operacja wstawiania i usuwania nie ma cile ustalonego miejsca, tzn. moemy wstawia (usuwa) element z pocztku, koca lub rodka listy. a) Deklaracja typu definiujcego element struktury kolejki struct Element typ_danych dane; // typ danych przechowywanych w licie Element *nastepny; // adres na nastpny element listy ; W dalszej czci wykładu bdziemy dla uproszczenia zakładali, e przechowujemy w strukturze liczby całkowite (typ_danych=int) a) Operacja add wstawiania do listy Element *add(element *first, int d, Element *current) Przed add(first, d, current) F 16 dane F 16 nastepny Po add(first, d, current) current current d 13

Gdy parametr current=, to nowy element jest wstawiany jako pierwszy na licie (pod adres first). Element *add(element *F, int d, Element **current) Element *temp; if (*current == ) temp=f; F=(Element *)malloc(sizeof(element)); F->dane=d; F->nastepny=temp; *current=f; else temp=*current; *current=(element *)malloc(sizeof(element)); (*current)->dane=d; (*current)->nastepny=temp->nastepny; temp->nastepny=*current; return F; 14

c)operacja delete usuwania z Listy Element *delete (Element *F, int *d, Element **current) Przed delete(f, d, current) Po wywołaniu delete(f, d, current) F 16 dane F 16 nastepny current current d = Gdy parametr current ==, to wywołanie operacji delete nie zmienia listy. Element *delete(element *F, int *d, Element **current) Element *temp; if (F!= && *current!=) if (*current == F) temp=f->nastepny; *d=f->dane; free(f); F=temp; *current=f; else temp=f; while (temp!= && *current!=temp->nastepny) 15

return F; temp=temp->nastepny; if (temp!=) temp->nastepny=(*current)->nastepny; *d=(*current)->dane; free(*current); *current=temp->nastepny; c)funkcja get_address zwracajca adres danej wartoci Funkcja zwraca adres pusty, gdy szukanego elementu nie ma na licie albo adres podanej wartoci danych, o ile ta warto wystpuje na licie. Element *get_address(element *F, int d) Element *temp; temp=f; while (temp!= && temp->dane!=d) temp=temp->nastepny; return temp; 16

Przykład 7 // wstawianie na list liczb od 0 do // sprawdzenie, czy na licie wystpuje liczba 9 // drukowanie elementów listy połczone z ich usuwaniem Element *F=,*current=; int d; F=add(F,0,&current); current=f; for (int i=1;i<9;i++) F=add(F,i,&current); Element *tmp=get_address(f,9); if (tmp!=) printf("%d\n",tmp->dane); else printf("\n"); current=f; while (F!=) F=delete(F,&d,&current); printf("%d\n",d); 17