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

Podobne dokumenty
Podstawy informatyki 2

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

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

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

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

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)

Struktury danych: stos, kolejka, lista, drzewo

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

Dynamiczne struktury danych

Wstęp do programowania

Listy, kolejki, stosy

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

Algorytmy i Struktury Danych.

Algorytmy i Struktury Danych.

Programowanie i struktury danych 1 / 44

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

Algorytmy i Struktury Danych

Algorytmy i Struktury Danych.

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

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

Stos LIFO Last In First Out

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

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

ZASADY PROGRAMOWANIA KOMPUTERÓW

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

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

Obliczenia na stosie. Wykład 9. Obliczenia na stosie. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303

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

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

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

Algorytmy i struktury danych. wykład 5

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


Podstawowe struktury danych

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Wykład 7 Abstrakcyjne typy danych słownik (lista symboli)

Podstawy Informatyki. Wykład 6. Struktury danych

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce.

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

Programowanie obiektowe

Struktury dynamiczne

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

E S - uniwersum struktury stosu

Drzewa wyszukiwań binarnych (BST)

Struktury. Przykład W8_1

Wstęp do programowania

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

Odwrotna Notacja Polska

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

ALGORYTMY I STRUKTURY DANYCH

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

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

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

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

INFORMATYKA DANE.

Dynamiczne struktury danych

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

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

Drzewa poszukiwań binarnych

Część 4 życie programu

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

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

Wykład 4. Klasa List Kolejki Stosy Słowniki

Abstrakcyjne struktury danych w praktyce

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

Programowanie obiektowe

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

Struktury danych (I): kolejka, stos itp.

WYKŁAD 9. Algorytmy sortowania elementów zbioru (tablic) Programy: c4_1.c... c4_3.c. Tomasz Zieliński

Programowanie obiektowe

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

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

Teoretyczne podstawy informatyki

Składnia rachunku predykatów pierwszego rzędu

Struktury Danych i Złożoność Obliczeniowa

Porządek symetryczny: right(x)

Ogólne wiadomości o grafach

Programowanie i struktury 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

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

Języki i metodyka programowania. Wprowadzenie do języka C

Lista, Stos, Kolejka, Tablica Asocjacyjna

Drzewo binarne BST. LABORKA Piotr Ciskowski

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

Abstrakcyjne struktury danych - stos, lista, drzewo

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

Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Podstawy Informatyki. Metody dostępu do danych

dr inż. Jarosław Forenc

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

Kolejka priorytetowa. Często rozważa się kolejki priorytetowe, w których poszukuje się elementu minimalnego zamiast maksymalnego.

. Podstawy Programowania 2. Stos i jego zastosowania. Arkadiusz Chrobot. 6 marca 2018

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Teoretyczne podstawy informatyki

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne

Wykład 6. Drzewa poszukiwań binarnych (BST)

1. Kalkulator czterech działań. 2. Konwersja ciągu znaków do tablicy.

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

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

Transkrypt:

Wykład nr 2 2/6 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr II, studia stacjonarne Rok akademicki 2006/2007 Plan wykładu nr 2 Argumenty funkcji main Dynamiczne struktury danych stos kolejka lista jednokierunkowa dwukierunkowa cykliczna drzewo binarne Wykład nr 2 (07.03.2007) Wykład nr 2 3/6 Wykład nr 2 /6 Argumenty funkcji main int main(int argc, char *argv[]) argc (ang. argument count) - liczba argumentów, z jakimi program został wywołany argv (ang. argument vector) - wskaźnik do tablicy zawierającej argumenty wywołania programu umieszczone w wierszu polecenia Przykład: C:\>pr.exe par1 par2 par3 argc = argv[0] = C:\pr.exe argv[1] = par1 argv[2] = par2 argv[3] = par3 Argumenty funkcji main #include <stdio.h> int main(int argc, char *argv[]) int i; printf("argumenty funkcji main:\n"); printf("argc = %d\n",argc); for (i=0;i<argc;i++) printf("argv[%d] = %s\n",i,argv[i]); return 0; C:\>pr.exe par1 par2 par3 Argumenty funkcji main: argc = argv[0] = pr.exe argv[1] = par1 argv[2] = par2 argv[3] = par3 Wyświetlenie argumentów funkcji main w przypadku programów uruchamianych bezpośrednio ze środowiska Dev-C++ argumenty wpisuje się wybierając: Uruchom Parametry

ź ę Wykład nr 2 5/6 Wykład nr 2 6/6 Dynamiczne struktury danych Dynamiczne struktury danych są to proste i złoŝone struktury danych, którym pamięć moŝe być przydzielana i zwalniana w trakcie wykonywania programu Elementami takich struktur mogą być: dane typów prostych, np. liczby, znaki dane typów złoŝonych, np. struktury, tablice, obiekty Do podstawowych dynamicznych struktur danych naleŝą: stos kolejka listy: jednokierunkowa dwukierunkowa cykliczna, jednokierunkowa cykliczna, dwukierunkowa drzewa stos (ang. stack) jest strukturą danych składającą 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) 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 (wskaźnik next) zawierający adres następnego elementu wskaźnik ostatniego elementu stosu wskazuje na adres pusty (NULL) dane (data) są umowną nazwą pewnych struktur Wykład nr 2 7/6 Wykład nr 2 8/6 nazwa stos odnosi się ściśle do funkcjonowania tej struktury - stos przypomina stertę kartek, na której wierzchołku moŝna połoŝyć kartkę lub ją zdjąć struktura stosu bywa nazywana stosem LIFO (ang. Last In First Out - ostatni wchodzi, pierwszy wychodzi) podstawowe operacje na stosie to: dodanie elementu do stosu, czyli połoŝenie elementu na stosie - funkcja push() zdjęcie elementu ze stosu, czyli pobranie elementu ze stosu - funkcja pop() Implementacja w języku C: dane przechowywane na stosie są najczęściej pewną strukturą - dla uproszczenia przyjmijmy, Ŝe struktura skład się tylko z jednego pola typu int struct element int x; ; kaŝdy składnik stosu skład się z uŝytecznych danych przechowywanych na stosie (data) oraz ze wskaźnika (next) zawierającego adres następnego elementu ródło: A. Zalewski: Programowanie w j zykach C i C++ z wykorzystaniem pakietu Borland C++ struct stos struct stos *next; ;

Wykład nr 2 9/6 Wykład nr 2 10/6 Implementacja w języku C - połoŝenie elementu na stosie: Implementacja w języku C - zdjęcie elementu ze stosu: funkcja dodająca element do stosu ma postać: funkcja usuwająca element ze stosu ma postać: struct stos *push(struct stos *top, struct element data) struct stos *wsk; struct stos *pop(struct stos *top, struct element *data) struct stos *wsk; wsk = (struct stos*) malloc(sizeof(struct stos)); wsk->next = top; if (top!=null) wsk = top->next; *data = top->data; free(top); else return NULL; top = push(top,data); przed pierwszym wywołaniem funkcji push(), wskaźnik top musi mieć wartość NULL top = pop(top,&data); Wykład nr 2 11/6 Wykład nr 2 12/6 - przykład (1/3) - przykład (2/3) #include <stdio.h> #include <stdlib.h> struct element int x; ; struct stos struct stos *next; ; Implementacja stosu w języku C struct stos *push(struct stos *top, struct element data) struct stos *wsk; wsk = (struct stos*) malloc(sizeof(struct stos)); wsk->next = top; struct stos *pop(struct stos *top, struct element *data) struct stos *wsk; if (top!=null) wsk = top->next; *data = top->data; free(top); else return NULL; Implementacja stosu w języku C

Wykład nr 2 13/6 Wykład nr 2 1/6 - przykład (3/3) int main() int tab[5] = 1,2,3,,5; struct stos *top = NULL; int i; for (i=0;i<5;i++) data.x = tab[i]; top = push(top,data); printf("push() --> %d\n",data.x); push() --> 1 push() --> 2 push() --> 3 push() --> push() --> 5 pop() --> 5 pop() --> pop() --> 3 pop() --> 2 pop() --> 1 Tablicowa implementacja stosu: przedstawiona wcześniej struktura stosu jest to tzw. listowa implementacja stosu istniej takŝe tablicowa implementacja stosu printf("\n"); while (top!=null) top=pop(top,&data); printf("pop() --> %d\n",data.x); system("pause"); return 0; Implementacja stosu w języku C rozmiar tablicy jest stały i określany w momencie tworzenia stosu elementy stosu przechowywane są w tablicy, przy czym im później element został połoŝony, tym dalej w tablicy się znajduje wskaźnik stosu określa indeks tablicy, pod który zapisana zostanie następna dana umieszczana na stosie przy umieszczaniu danej na stosie indeks jest zwiększany, zaś przy zdejmowaniu danej ze stosu - zmniejszany Wykład nr 2 15/6 Wykład nr 2 16/6 Notacja polska 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: / (1 + 3) ma w notacji polskiej postać: / + 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 jest bliska naturalnemu sposobowi wyraŝania działań, w którym zazwyczaj najpierw podaje się czynność, a następnie dopełnia wyraŝenia wskazaniem rzeczy, do których czynność się odnosi, np. podziel cztery przez sumę jednego i trzech notację polską przedstawił w 1920 roku polski matematyk Jan Łukasiewicz zapis wyraŝeń w notacji polskiej stał się podstawą języków: Logo, Tcl i LISP notacja polska była podstawą opracowania tzw. odwrotnej notacji polskiej Odwrotna notacja polska odwrotna notacja polska - ONP (ang. Reverse Polish Notation, RPN) jest sposobem zapisu wyraŝeń arytmetycznych, w którym znak wykonywanej operacji umieszczany jest po argumentach, a nie pomiędzy nimi jak w konwencjonalnym zapisie algebraicznym wyraŝenie arytmetyczne: (1 + 3) / 2 ma w odwrotnej notacji polskiej postać: 1 3 + 2 / ONP została opracowana przez australijskiego naukowca Charlesa Hamblina jako odwrócenie beznawiasowej notacji polskiej Jana Łukasiewicza na potrzeby zastosowań informatycznych zapis wyraŝenia w ONP pozwala na całkowita rezygnację z uŝycia nawiasów w wyraŝeniach, gdyŝ jednoznacznie określa kolejność wykonywania działań ONP uŝywana jest w niektórych językach programowania (FORTH, Postscript) oraz w kalkulatorach naukowych HP: programy komputerowe kompilujące program analizują wyraŝenie arytmetyczne i przekształcają je na ciąg instrukcji odpowiadający odwrotnej notacji polskiej otrzymane wyraŝenie obliczane jest podczas wykonywania programu

Wykład nr 2 17/6 Wykład nr 2 18/6 Odwrotna notacja polska obliczenie wartości wyraŝenia arytmetycznego przy zastosowaniu odwrotnej notacji polskiej wymaga wykonania dwóch operacji: zamiany notacji konwencjonalnej (nawiasowej) na odwrotną notację polską obliczenia wartości wyraŝenia arytmetycznego zapisanego w odwrotnej notacji polskiej oba powyŝsze algorytmy są bardzo proste i wykorzystują stos Zamiana wyraŝenia z notacji konwencjonalnej na ONP: zamiana wykonywana jest przy zastosowaniu algorytmu Dijkstry nazywanego stacją rozrządową czytając wyraŝenie arytmetyczne od strony lewej do strony prawej operatory odkładamy na stos a liczby na wyjście wyjście naleŝy traktować jako kolejkę, która po zakończeniu algorytmu będzie zawierała wyraŝenie w odwrotnej notacji polskiej Odwrotna notacja polska Zamiana wyraŝenia z notacji konwencjonalnej na ONP: wykonując powyŝsze operacje trzeba stosować następujące reguły: operator moŝemy odłoŝyć na stos tylko wtedy, jeśli ostatnim elementem stosu jest operator o niŝszym priorytecie jeŝeli ma on wyŝszy lub równy priorytet to zdejmujemy ze stosu dotąd elementy i wysyłamy na wyjście, aŝ ostatni operator będzie miał niŝszy priorytet lub stos będzie pusty jeśli kolejnym elementem jest nawias otwierający (, to odkładamy go na stos, bez względu na to co znajduje się w danym momencie na stosie i bez względu na to czy stos jest pusty powyŝszy nawias traktujemy jak dno stosu i odczytujemy kolejne elementy wyraŝenia według standardowego algorytmu jeśli dojdziemy do nawiasu zamykającego ), to nigdzie go nie odkładamy, tylko zdejmujemy kolejne operatory ze stosu i wysyłamy na wyjście, aŝ dojdziemy do nawiasu otwierającego, który równieŝ zdejmujemy ze stosu i wysyłamy na wyjście jeśli dojdziemy do końca wyraŝenia arytmetycznego, to zdejmujemy ze stosu pozostałe operatory i wysyłamy je na wyjście Wykład nr 2 19/6 Wykład nr 2 20/6 Odwrotna notacja polska Zamiana wyraŝenia z notacji konwencjonalnej na ONP - przykład: równanie w notacji konwencjonalnej: (2+1)*3-*(7+) Krok 1 2 3 5 6 7 8 9 10 11 12 13 1 15 16 17 Wejście ( 2 + 1 ) * 3 - * ( 7 + ) Koniec ( NULL ( NULL + ( NULL + ( NULL NULL * NULL * NULL - NULL - NULL * - NULL ( * - NULL ( * - NULL + ( * - NULL + ( * - NULL * - NULL - NULL równanie w ONP: 2 1 + 3 * 7 + * - NULL Wyjście 2 1 + 3 * 7 + * - Odwrotna notacja polska Obliczenie wartości wyraŝenia arytmetycznego w ONP: Uwaga: w algorytmie obliczania wartości wyraŝenia arytmetycznego zapisanego w odwrotnej notacji polskiej wykonujemy następujące operacje: pobieramy kolejny element wyraŝenia jeśli elementem jest liczba to odkładamy ją na stos jeśli elementem jest operator, to pobieramy ze stosu tyle liczb, aby moŝna było zastosować operator na tych liczbach, np. dla dodawania, odejmowania, mnoŝenia i dzielenia są to dwie kolejne liczby, zaś dla negacji - jedna liczba wykonujemy operację na liczbach i jej wynik odkładamy na stos jeśli dotrzemy do końca wyraŝenia, to pobieramy wynik ze stosu, który jest wartością wyraŝenia arytmetycznego jeśli nie ma jeszcze końca, to wracamy na początek algorytmu jeśli np. stos ma postać: 2 NULL i mamy wykonać operację dzielenia /, to operacja ta ma postać: / 2, czyli do wykonania operacji argumenty brane są w odwrotnej kolejności

ź ę Wykład nr 2 21/6 Wykład nr 2 22/6 Odwrotna notacja polska Kolejka Obliczenie wartości wyraŝenia arytmetycznego w ONP - przykład: równanie w ONP: 2 1 + 3 * 7 + * - równanie w ONP: -35 Krok Wejście Działanie 1 2 2 NULL 2 1 1 2 NULL 3 + 3 NULL 2 + 1 3 3 3 NULL 5 * 9 NULL 3 * 3 6 9 NULL 7 7 7 9 NULL 8 7 9 NULL 9 + 11 9 NULL 7 + 10 * 9 NULL * 11 11 - -35 NULL 9 12 Koniec NULL wynik: -35 kolejka (ang. queue) jest strukturą danych składającą się z liniowo uporządkowanych elementów, do której moŝna dołączać elementy tylko w jednym końcu (na końcu kolejki), a usuwać tylko w drugim końcu (na początku kolejki) kolejka często określana jest jako stos FIFO (ang. First In First Out - pierwszy wchodzi, pierwszy wychodzi) powiązanie między elementami kolejki jest takie samo, jak w przypadku stosu head jest wskaźnikiem na pierwszy element kolejki (początek kolejki), zaś tail - na ostatni element kolejki (koniec kolejki) Wykład nr 2 23/6 Wykład nr 2 2/6 Kolejka Kolejka korzystając z poprzedniej analogii, stosu kartek, moŝemy powiedzieć, Ŝe kładziemy kartki na wierzchołku stosu, zaś wyjmujemy ze spodu kolejkę moŝna takŝe wyobraŝać sobie jako typową kolejkę sklepową podstawowe operacje dotyczące kolejki to: dołączenie elementu do kolejki - Insert() lub enqueue() usunięcie elementu z kolejki - Remove() lub dequeue() Implementacja w języku C: dane przechowywane w kolejce są najczęściej pewną strukturą - dla uproszczenia przyjmijmy, Ŝe struktura skład się tylko z jednego pola typu int struct element int x; ; kaŝdy składnik kolejki skład się z uŝytecznych danych przechowywanych w kolejce (data) oraz ze wskaźnika (next) zawierającego adres następnego elementu ródło: A. Zalewski: Programowanie w j zykach C i C++ z wykorzystaniem pakietu Borland C++ struct kolejka struct kolejka *next; ;

Wykład nr 2 25/6 Wykład nr 2 26/6 Kolejka Implementacja w języku C - dołączenie elementu do kolejki: Kolejka Implementacja w języku C - usunięcie elementu z kolejki: funkcja dodająca element do kolejki ma postać: funkcja usuwająca element z kolejki ma postać: struct kolejka *Insert(struct kolejka *tail, struct element data) struct kolejka *wsk; struct kolejka *Remove(struct kolejka *head, struct element *data) struct kolejka *wsk; wsk = (struct kolejka*) malloc(sizeof(struct kolejka)); wsk->next = NULL; if (tail!= NULL) tail->next = wsk; if (head!=null) wsk = head->next; *data = head->data; free(head); else return NULL; head = tail = Insert(tail,data); /* pierwsze wywołanie */ tail = Insert(tail,data); /* kolejne wywołania */ przed pierwszym wywołaniem funkcji head i tail powinny mieć wartość NULL head = Remove(head,&data); Wykład nr 2 27/6 Wykład nr 2 28/6 Kolejka - przykład (1/3) Kolejka - przykład (2/3) #include <stdio.h> #include <stdlib.h> struct element int x; ; struct kolejka struct kolejka *next; ; Implementacja kolejki w języku C struct kolejka *Insert(struct kolejka *tail, struct element data) struct kolejka *wsk; wsk = (struct kolejka*) malloc(sizeof(struct kolejka)); wsk->next = NULL; if (tail!= NULL) tail->next = wsk; struct kolejka *Remove(struct kolejka *head, struct element *data) struct kolejka *wsk; if (head!=null) wsk = head->next; *data = head->data; free(head); else return NULL; Implementacja kolejki w języku C

Wykład nr 2 29/6 Wykład nr 2 30/6 Kolejka - przykład (3/3) Lista int main() int tab[5] = 1,2,3,,5; struct kolejka *head, *tail; int i; head = tail = NULL; for (i=0;i<5;i++) data.x = tab[i]; if (i==0) head = tail = Insert(tail,data); else tail = Insert(tail, data); printf("insert() --> %d\n",data.x); Insert() --> 1 Insert() --> 2 Insert() --> 3 Insert() --> Insert() --> 5 Remove() --> 1 Remove() --> 2 Remove() --> 3 Remove() --> Remove() --> 5 listą (liniową) nazywamy liniowo uporządkowany zbiór elementów, z którego w dowolnym miejscu moŝna usunąć element, jak równieŝ dołączyć nowy element sposób budowy listy jest ściśle uzaleŝniony od zamierzeń programisty elementy moŝna wstawiać do listy na początku, na końcu lub w dowolnym innym miejscu (np. w celu przechowywania elementów posortowanych) w zaleŝności od powiązań pomiędzy elementami wyróŝniamy listy: jednokierunkowe dwukierunkowe cykliczne, jednokierunkowe cykliczne, dwukierunkowe printf("\n"); while (head!=null) head = Remove(head,&data); printf("remove() --> %d\n",data.x); return 0; Implementacja kolejki w języku C Wykład nr 2 31/6 Wykład nr 2 32/6 Lista jednokierunkowa Lista jednokierunkowa organizacja listy jednokierunkowej podobna jest do organizacji stosu i kolejki, tzn. dla kaŝdego składnika (poza ostatnim) jest określony następny składnik (lub poprzedni - zaleŝnie od implementacji) zapamiętywany jest wskaźnik tylko na pierwszy element listy lub wskaźniki na pierwszy i ostatni element listy Implementacja w języku C: dane przechowywane na liście są najczęściej pewną strukturą - dla uproszczenia przyjmijmy, Ŝe struktura skład się tylko z jednego pola typu int struct element int x; ; kaŝdy składnik listy skład się z uŝytecznych danych przechowywanych na liście (data) oraz ze wskaźnika (next) zawierającego adres następnego elementu struct lista struct lista *next; ;

Wykład nr 2 33/6 Wykład nr 2 3/6 Lista jednokierunkowa Implementacja w języku C - dołączenie elementu na początku listy: Lista jednokierunkowa Implementacja w języku C - dołączenie elementu na końcu listy: funkcja dodająca element na początku listy ma postać: funkcja dodająca element na końcu listy ma postać: struct lista *dodaj_pierwszy(struct lista *first, struct element data) struct lista *wsk; struct lista *dodaj_ostatni(struct lista *last, struct element data) struct lista *wsk; wsk = (struct lista*) malloc(sizeof(struct lista)); wsk->next = first; wsk = (struct lista*) malloc(sizeof(struct lista)); wsk->next = NULL; if (last!=null) last->next = wsk; first = last = dodaj_pierwszy(first,data); /* pierwsze wywołanie */ first = dodaj_pierwszy(first,data); /* kolejne wywołania */ first = last = dodaj_ostatni(last,data); /* pierwsze wywołanie */ last = dodaj_ostatni(last,data); /* kolejne wywołania */ przed pierwszym wywołaniem funkcji wskaźnik first powinien mieć wartość NULL przed pierwszym wywołaniem funkcji wskaźnik last powinien mieć wartość NULL Wykład nr 2 35/6 Wykład nr 2 36/6 Lista jednokierunkowa Implementacja w języku C - usunięcie wszystkich elementów: Lista jednokierunkowa Implementacja w języku C - wyświetlenie wszystkich elementów: funkcja usuwająca wszystkie elementy z listy ma postać: funkcja wyświetlająca wartość wszystkich elementów listy: struct lista *usun_wszystko(struct lista *first) struct lista *wsk; while (first!=null) wsk = first->next; free(first); first = wsk; return first; void wyswietl_liste(struct lista *first) while (first!=null) printf("lista --> %d\n",first->data.x); first = first->next; wyswietl_liste(first); first = last = usun_wszystko(first);

Wykład nr 2 37/6 Wykład nr 2 38/6 Lista jednokierunkowa - przykład (1/5) Lista jednokierunkowa - przykład (2/5) #include <stdio.h> #include <stdlib.h> struct element int x; ; struct lista struct lista *next; ; Implementacja listy jednokierunkowej w języku C struct lista *dodaj_pierwszy(struct lista *first, struct element data) struct lista *wsk; wsk = (struct lista*) malloc(sizeof(struct lista)); wsk->next = first; struct lista *dodaj_ostatni(struct lista *last, struct element data) struct lista *wsk; wsk = (struct lista*) malloc(sizeof(struct lista)); wsk->next = NULL; if (last!=null) last->next = wsk; Implementacja listy jednokierunkowej w języku C Wykład nr 2 39/6 Wykład nr 2 0/6 Lista jednokierunkowa - przykład (3/5) Lista jednokierunkowa - przykład (/5) struct lista *usun_wszystko(struct lista *first) struct lista *wsk; while (first!=null) wsk = first->next; free(first); first = wsk; return first; void wyswietl_liste(struct lista *first) while (first!=null) printf("lista --> %d\n",first->data.x); first = first->next; Implementacja listy jednokierunkowej w języku C int main() int tab[5] = 1,2,3,,5; struct lista *first = NULL, *last = NULL; int i; for (i=0;i<5;i++) data.x = tab[i]; if (i==0) first = last = dodaj_pierwszy(first,data); else first = dodaj_pierwszy(first,data); printf("dodaj_pierwszy() --> %d\n",data.x); printf("\n"); wyswietl_liste(first); first = last = usun_wszystko(first); dodaj_pierwszy() --> 1 dodaj_pierwszy() --> 2 dodaj_pierwszy() --> 3 dodaj_pierwszy() --> dodaj_pierwszy() --> 5 Lista --> 5 Lista --> Lista --> 3 Lista --> 2 Lista --> 1 Implementacja listy jednokierunkowej w języku C

Wykład nr 2 1/6 Wykład nr 2 2/6 Lista jednokierunkowa - przykład (5/5) Lista dwukierunkowa printf("\n\n"); for (i=0;i<5;i++) data.x = tab[i]; if (i==0) first = last = dodaj_ostatni(last,data); else last = dodaj_ostatni(last,data); printf("dodaj_ostatni() --> %d\n",data.x); printf("\n"); wyswietl_liste(first); first = last = usun_wszystko(first); dodaj_ostatni() --> 1 dodaj_ostatni() --> 2 dodaj_ostatni() --> 3 dodaj_ostatni() --> dodaj_ostatni() --> 5 Lista --> 1 Lista --> 2 Lista --> 3 Lista --> Lista --> 5 w liście dwukierunkowej 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) system("pause"); return 0; Implementacja listy jednokierunkowej w języku C Wykład nr 2 3/6 Wykład nr 2 /6 Lista cykliczna Drzewo listę cykliczną moŝna utworzyć z listy jednokierunkowej lub dwukierunkowej, jeśli ostatni element tej struktury połączymy z pierwszym Jednokierunkowa: Dwukierunkowa: drzewo jest najbardziej ogólną dynamiczną strukturą danych i moŝe być reprezentowane graficznie na róŝne sposoby korzeń drzewa jest umieszczony u góry skojarzone z korzeniem poddrzewa połączone są z korzeniem liniami zwanymi gałęziami drzewa 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ł w nazywamy przodkiem węzłów drzewa, w którym w jest korzeniem bezpośrednich potomków nazywamy synami bezpośrednich przodków nazywamy ojcami synów tego samego ojca nazywamy braćmi węzeł, który nie ma potomków, to liść drzewa

Wykład nr 2 5/6 Wykład nr 2 6/6 Drzewo binarne Binarne drzewo wyszukiwawcze drzewo binarne jest szczególnym przypadkiem ogólnej struktury zwanej drzewem kaŝdy wierzchołek drzewa ma co najwyŝej dwóch potomków, tzn. kaŝdy ojciec ma co najwyŝej dwóch synów jest to drzewo binarne, w którym dla kaŝdego węzła w i wszystkie klucze (przechowywane wartości) w lewym poddrzewie węzła w i są mniejsze od klucza w węźle w i, a wszystkie klucze w prawym poddrzewie węzła w i są większe od klucza w węźle w i największą zaletą takiej struktury jest szybkość wyszukiwania informacji