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



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

Podstawy informatyki 2. Podstawy informatyki 2. Wykład nr 2 ( ) Plan wykładu nr 2. Politechnika Białostocka. - Wydział Elektryczny

Podstawy informatyki 2

Informatyka 2. Wykład nr 5 ( ) Plan wykładu nr 5. Politechnika Białostocka. - Wydział Elektryczny. Odwrotna notacja polska.

Informatyka 2. Wykład nr 5 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

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

Struktury danych: stos, kolejka, lista, drzewo

Informatyka 2. Wykład nr 2 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

Wstęp do programowania

Podstawy Informatyki. Wykład 6. Struktury danych

Algorytmy i. Wykład 3: Stosy, kolejki i listy. Dr inż. Paweł Kasprowski. FIFO First In First Out (kolejka) LIFO Last In First Out (stos)

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

Listy, kolejki, stosy

Programowanie obiektowe

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

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

ZASADY PROGRAMOWANIA KOMPUTERÓW

Programowanie obiektowe

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

Dynamiczne struktury danych

Wykład 3. Złożoność i realizowalność algorytmów Elementarne struktury danych: stosy, kolejki, listy

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

Wykład X. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2016 Janusz Słupik

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

Informatyka 2. Informatyka 2. Wykład nr 1 ( ) Dane podstawowe. - Wydział Elektryczny. Politechnika Białostocka. Program wykładu (1/2)

STRUKTURY DANYCH I ZŁOŻONOŚĆ OBLICZENIOWA STRUKTURY DANYCH I ZŁOŻONOŚĆ OBLICZENIOWA. Część 3. Drzewa Przeszukiwanie drzew

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

INFORMATYKA. Podstawy programowania w języku C. (Wykład) Copyright (C) 2005 by Sergiusz Sienkowski IME Zielona Góra

ALGORYTMY I STRUKTURY DANYCH

dr inż. Jarosław Forenc

Algorytmy i Struktury Danych.

Wysokość drzewa Głębokość węzła

Algorytmy i Struktury Danych

Podstawy Informatyki. Metody dostępu do danych

if (warunek) instrukcja1; if (warunek) instrukcja1; else instrukcja2; a > b - a większe od b if (warunek) instrukcja1; a <= b - a mniejsze lub równe b

Struktury. Przykład W8_1

Struktury dynamiczne

Drzewa wyszukiwań binarnych (BST)

Algorytmy i struktury danych. wykład 5

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

Teoretyczne podstawy informatyki

Algorytmy i Struktury Danych.

Wyszukiwanie w BST Minimalny i maksymalny klucz. Wyszukiwanie w BST Minimalny klucz. Wyszukiwanie w BST - minimalny klucz Wersja rekurencyjna

Programowanie i struktury danych

Struktury Danych i Złożoność Obliczeniowa

Algorytmy i Struktury Danych.

Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska

Drzewa poszukiwań binarnych

Drzewa BST i AVL. Drzewa poszukiwań binarnych (BST)

Notacja RPN. 28 kwietnia wyliczanie i transformacja wyrażeń. Opis został przygotowany przez: Bogdana Kreczmera.

Abstrakcyjne struktury danych - stos, lista, drzewo

. Podstawy Programowania 2. Drzewa bst - część druga. Arkadiusz Chrobot. 12 maja 2019

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

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

< K (2) = ( Adams, John ), P (2) = adres bloku 2 > < K (1) = ( Aaron, Ed ), P (1) = adres bloku 1 >

ALGORYTMY I STRUKTURY DANYCH

Wykład 2. Drzewa zbalansowane AVL i 2-3-4

INFORMATYKA DANE.

dr inż. Jarosław Forenc

Wskaźniki w C. Anna Gogolińska

dr inż. Jarosław Forenc

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

Stos LIFO Last In First Out

Wstęp do programowania

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

Struktury Struktura polami struct struct struct struct

Odwrotna Notacja Polska

WSTĘP DO INFORMATYKI. Struktury liniowe

prowadzący dr ADRIAN HORZYK /~horzyk tel.: Konsultacje paw. D-13/325

Programowanie obiektowe

dr inŝ. Jarosław Forenc

for (i=0; i<10; i=i+1) instrukcja; instrukcja zostanie wykonana 10 razy for (inicjalizacja; test; aktualizacja) instrukcja;

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Algorytmy i struktury danych Laboratorium 7. 2 Drzewa poszukiwań binarnych

Abstrakcyjne struktury danych w praktyce

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

Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach

Drzewo binarne BST. LABORKA Piotr Ciskowski

Teoretyczne podstawy informatyki

Programowanie i struktury danych

PLAN WYKŁADU BAZY DANYCH INDEKSY - DEFINICJE. Indeksy jednopoziomowe Indeksy wielopoziomowe Indeksy z użyciem B-drzew i B + -drzew

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

Spis treści JĘZYK C - TABLICE JEDNOWYMIAROWE. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF05Z

Programowanie i struktury danych 1 / 44

. Podstawy Programowania 2. Drzewa bst - część pierwsza. Arkadiusz Chrobot. 22 maja 2016

WYŻSZA SZKOŁA INFORMATYKI STOSOWANEJ I ZARZĄDZANIA

Deklaracja struktury w C++

Struktury czyli rekordy w C/C++

Algorytmy i Struktury Danych. Co dziś? Drzewo decyzyjne. Wykład IV Sortowania cd. Elementarne struktury danych

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Podstawowe struktury danych

Wstęp do wskaźników w języku ANSI C

Podstawy algorytmiki i programowania - wykład 4 C-struktury

Przypomnij sobie krótki wstęp do teorii grafów przedstawiony na początku semestru.

Dynamiczne struktury danych

Tadeusz Pankowski

Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula

Metody Kompilacji Wykład 3

E S - uniwersum struktury stosu

Wstęp do programowania

Transkrypt:

Rok akademicki 2012/2013, Wykład nr 2 2/25 Plan wykładu nr 2 Informatyka 2 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr III, studia niestacjonarne I stopnia Rok akademicki 2012/2013 Dynamiczny przydział pamięci w języku C przydział pamięci na macierz Dynamiczne struktury danych stos, kolejka, lista, drzewo Wykład nr 2 (19.10.2012) dr inż. Jarosław Forenc Rok akademicki 2012/2013, Wykład nr 2 3/25 Rok akademicki 2012/2013, Wykład nr 2 4/25 Dynamiczny przydział pamięci na macierz (1) Dynamiczny przydział pamięci na macierz (1) przydzielamy dynamicznie pamięć na macierz zawierającą N-wierszy i M-kolumn Metoda 1 (wektor N M-elementowy) przydzielamy pamięć na wektor N M-elementowy N [0][0] [0][1] [0][2] [0][3] [1][0] [1][1] [1][2] [1][3] [2][0] [2][1] [2][2] [2][3] po wykorzystaniu wektora, przydzieloną pamięć zwalniamy funkcją free() M zamiast standardowego odwołania do elementów macierzy: tab[i][j] stosujemy odwołania do odpowiednich elementów wektora: *(tab+i*m+j) lub tab[i*m+j] Przykład: tablica tab, dla której N=3, M=4 odwołujemy się do elementu tab[2][2]: *(tab+2*4+2) int *tab; tab = (int*) calloc(n*m,sizeof(int)); /*... */ free(tab);

Rok akademicki 2012/2013, Wykład nr 2 5/25 Rok akademicki 2012/2013, Wykład nr 2 6/25 Dynamiczny przydział pamięci na macierz (1) Dynamiczny przydział pamięci na macierz (2) #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 4 #define M 6 int main() int i,j,*tab; } tab = (int *) calloc(n*m,sizeof(int)); srand(time(null)); for (i=0;i<n;i++) for (j=0;j<m;j++) *(tab+m*i+j) = rand()%100; for (i=0;i<n;i++) for (j=0;j<m;j++) printf("%4d",tab[m*i+j]); printf("\n"); } free(tab); return 0; 77 59 49 41 82 62 89 80 86 52 7 64 51 43 4 29 23 98 52 10 2 43 37 95 Metoda 2 (wskaźnik na tablicę wskaźników) przydzielamy pamięć na N-elementowy wektor wskaźników do typu int int ** int * odwołania do elementów takiej tablicy mają taką samą postać jak w przypadku zwykłych tablic: tab[i][j] przydzielona pamięć nie stanowi ciągłego obszaru w pamięci komputera int Rok akademicki 2012/2013, Wykład nr 2 7/25 Rok akademicki 2012/2013, Wykład nr 2 8/25 Dynamiczny przydział pamięci na macierz (3) Dynamiczne struktury danych Metoda 3 (wektor N M-elementowy + wektor wskaźników) przydzielamy pamięć na N-elementowy wektor wskaźników do typu int i na N M-elementowy wektor elementów typu int, którego adres zapisujemy pod zerowym elementem wektora N-elementowego int ** int * do pozostałych elementów wektora N-elementowego zapisujemy adresy pierwszych elementów kolejnych wierszy macierzy znajdujących się w wektorze N M-elementowym odwołania do elementów: tab[i][j] int Dynamiczne struktury danych - struktury danych, którym pamięć jest przydzielana i zwalniana w trakcie wykonywania programu stos, kolejka lista (jednokierunkowa, dwukierunkowa, cykliczna) drzewo Elementy w dynamicznych strukturach danych są strukturami składającymi się z użytecznych danych (data) oraz z jednego lub kilku wskaźników (next) zawierających adresy innych elementów struct element typ data; struct element *next;

Rok akademicki 2012/2013, Wykład nr 2 9/25 Rok akademicki 2012/2013, Wykład nr 2 10/25 Stos Stos - zastosowanie: notacja polska stos (ang. stack) - struktur składająca się z elementów, z których każdy posiada tylko adres następnika dostęp do danych przechowywanych na stosie jest możliwy tylko w miejscu określanym mianem wierzchołka stosu (ang. top) tutaj dodajemy i usuwamy elementy top notacja polska (zapis przedrostkowy, Notacja Łukasiewicza) jest to sposób zapisu wyrażeń arytmetycznych, podający najpierw operator, a następnie argumenty wyrażenie arytmetyczne: wierzchołek stosu jest jedynym miejscem, do którego można dołączać lub z którego można usuwać elementy każdy składnik stosu posiada wyróżniony element (next) zawierający adres następnego elementu wskaźnik ostatniego elementu stosu wskazuje na adres pusty (NULL) podstawowe operacje na stosie to: dodanie elementu do stosu - funkcja push() zdjęcie elementu ze stosu - funkcja pop() data next data next data next NULL wierzchołek 4 / (1 + 3) ma w notacji polskiej postać: / 4 + 1 3 wyrażenie w notacji polskiej nie wymaga nawiasów, ponieważ przypisanie argumentów do operatorów wynika wprost z ich kolejności w zapisie notacja polska była podstawą opracowania tzw. odwrotnej notacji polskiej Rok akademicki 2012/2013, Wykład nr 2 11/25 Rok akademicki 2012/2013, Wykład nr 2 12/25 Stos - zastosowanie: odwrotna notacja polska Stos - zastosowanie: odwrotna notacja polska odwrotna notacja polska - ONP (ang. Reverse Polish Notation, RPN) jest sposobem zapisu wyrażeń arytmetycznych, w którym operator umieszczany jest po argumentach wyrażenie arytmetyczne: (1 + 3) / 2 ma w odwrotnej notacji polskiej postać: 1 3 + 2 / Obliczenie wartości wyrażenia przy zastosowaniu ONP wymaga: zamiany notacji konwencjonalnej (nawiasowej) na ONP (algorytm Dijkstry nazywany stacją rozrządową) obliczenia wartości wyrażenia arytmetycznego zapisanego w ONP W obu powyższych algorytmach wykorzystywany jest stos Przykład: wyrażenie arytmetyczne: (2 + 1) * 3 4 * (7 + 4) odwrotna notacja polska została opracowana przez australijskiego naukowca Charlesa Hamblina ma w odwrotnej notacji polskiej postać: 2 1 + 3 * 4 7 4 + * -

Rok akademicki 2012/2013, Wykład nr 2 13/25 Rok akademicki 2012/2013, Wykład nr 2 14/25 Kolejka Lista jednokierunkowa Kolejka - składa się z liniowo uporządkowanych elementów Elementy dołączane są tylko na końcu kolejki (wskaźnik tail) Elementy usuwane są tylko z początku kolejki (wskaźnik head) Organizacja listy jednokierunkowej podobna jest do organizacji stosu i kolejki Dla każdego składnika (poza ostatnim) jest określony następny składnik (lub poprzedni - zależnie od implementacji) Powiązanie między elementami kolejki jest takie samo, jak w stosie Kolejka nazywana jest stosem FIFO (ang. First In First Out) Zapamiętywany jest wskaźnik tylko na pierwszy element listy (first) lub wskaźniki na pierwszy (first) i ostatni element listy (last) Elementy listy można dołączać/usuwać w dowolnym miejscu listy Rok akademicki 2012/2013, Wykład nr 2 15/25 Rok akademicki 2012/2013, Wykład nr 2 16/25 Lista dwukierunkowa Lista cykliczna Każdy węzeł posiada adres następnika, jak i poprzednika W strukturze tego typu wygodne jest przechodzenie pomiędzy elementami w obu kierunkach (od początku do końca i odwrotnie) Powstaje z listy jednokierunkowej lub dwukierunkowej, poprzez połączenie ostatniego element z pierwszym Jednokierunkowa: Dwukierunkowa:

Rok akademicki 2012/2013, Wykład nr 2 17/25 Rok akademicki 2012/2013, Wykład nr 2 18/25 Drzewo Drzewo binarne Najbardziej ogólna dynamiczna struktura danych, może być reprezentowane graficznie na różne sposoby Szczególny przypadek ogólnej struktury zwanej drzewem Na górze znajduje się korzeń drzewa (a) Skojarzone z korzeniem poddrzewa połączone są z nim liniami zwanymi gałęziami drzewa Każdy wierzchołek drzewa binarnego ma co najwyżej dwóch potomków Potomkiem węzła w nazywamy każdy, różny od w, węzeł należący do drzewa, w którym w jest korzeniem Węzeł, który nie ma potomków, to liść drzewa Rok akademicki 2012/2013, Wykład nr 2 19/25 Rok akademicki 2012/2013, Wykład nr 2 20/25 Binarne drzewo wyszukiwawcze Drzewo binarne, w którym dla każdego węzła w i : wszystkie klucze w lewym poddrzewie węzła w i są mniejsze od klucza w węźle w i wszystkie klucze w prawym poddrzewie węzła w i są większe od klucza w węźle w i Struktura - zestaw elementów różnych typów, zgrupowanych pod jedną nazwą Deklaracja struktury rozpoczyna się od słowa kluczowego struct, po którym zazwyczaj występuje nazwa struktury (etykieta) Pomiędzy nawiasami klamrowymi umieszczone są pola struktury (komponenty, składowe), mające taką samą postać jak deklaracje zmiennych w programie struct nazwa opis_pola_1; opis_pola_2;... opis pola_n; Zaleta: szybkość wyszukiwania informacji W deklaracji struktury muszą występować nawiasy klamrowe i średniki

Rok akademicki 2012/2013, Wykład nr 2 21/25 Rok akademicki 2012/2013, Wykład nr 2 22/25 Pola jednego typu można łączyć przecinkami Nazwy pól struktury mogą być takie same jak nazwy innych zmiennych w programie, a nawet takie same jak nazwa struktury Deklarując strukturę wprowadzamy nowy typ danych (np. struct punkt), którym można posługiwać się tak samo jak każdym innym typem standardowym struct punkt int x; int y; struct czas int h, m, s; char imie[20]; char nazwisko[30]; int wiek, waga; Po klamrze kończącej listę pól struktury może występować deklaracja zmiennych strukturalnych Kowal i Nowak są zmiennymi typu W przypadku deklaracji, po której nie występuje lista zmiennych, nie następuje przydział pamięci Jeśli podana została nazwa struktury, to zmienne można zadeklarować później char imie[20]; char nazwisko[30]; int wiek; } Kowal, Nowak; char imie[20]; char nazwisko[30]; int wiek; int main() Kowal; Nowak;... Rok akademicki 2012/2013, Wykład nr 2 23/25 Rok akademicki 2012/2013, Wykład nr 2 24/25 Dostęp do pól struktury możliwy jest dzięki konstrukcji typu: nazwa_struktury.nazwa_pola Gdy zmienna strukturalna jest wskaźnikiem, to do odwołania do pola struktury używamy operatora pośredniego wyboru pola (->) Operator. nazywany jest operatorem bezpośredniego wyboru pola Nowak, *Nowak1; Nowak1 = &Nowak Nowak1 -> wiek = 25; Zapisanie wartości 25 do pola wiek zmiennej Nowak ma postać /* lub */ (*Nowak1).wiek = 25; Nowak.wiek = 25; Zapisanie wartości Jan do pola imie zmiennej Nowak ma postać W ostatnim zapisie nawiasy są konieczne, gdyż operator. ma wyższy priorytet niż operator * strcpy(nowak.wiek,"jan");

Rok akademicki 2012/2013, Wykład nr 2 25/25 Koniec wykładu nr 2 Dziękuję za uwagę!