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

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

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

Wykład 7 Abstrakcyjne typy danych kolejka priorytetowa

1. Abstrakcyjne typy danych

Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Wykład 1_2 Algorytmy sortowania tablic Sortowanie bąbelkowe

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

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

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

np. dla p=1 mamy T1(N) N/2 średni czas chybionego wyszukiwania z prawdopodobieństwem q:

Co nie powinno być umieszczane w plikach nagłówkowych:

Ćwiczenie 4 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Podstawy programowania skrót z wykładów:

1 Podstawy c++ w pigułce.

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

Ćwiczenie 5 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Języki i metody programowania Java INF302W Wykład 2 (część 1)

1 Podstawy c++ w pigułce.

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

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

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

Wstęp do programowania 1

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

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

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

Szablony klas, zastosowanie szablonów w programach

Wykład 9 - struktury rekurencyjne uporządkowane

E S - uniwersum struktury stosu

Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

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

Instrukcja wyboru, pętle. 2 wykład. Podstawy programowania - Paskal

Wykład 5_2 Algorytm ograniczania liczby serii za pomocą kopcowego rozdzielania serii początkowych

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

Programowanie Proceduralne

Projektowanie klas c.d. Projektowanie klas przykład

tablica: dane_liczbowe

Podstawy Informatyki sem. I 2014/2015 studia zaoczne Elektronika i Telekomunikacja!

int tab_a [ 2 ] [ 3 ];

struct Student { char nazwisko[30]; int wiek; float ocena; }; #define MAX_ROZMIAR 3 Student lista_studentow[max_rozmiar];

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

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

Wykład 3 Składnia języka C# (cz. 2)

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

Wstęp do programowania

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

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Struktury. Przykład W8_1

Wstęp do programowania

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 9. Algorytmy sortowania elementów zbioru (tablic) Programy: c4_1.c... c4_3.c. Tomasz Zieliński

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

Język C zajęcia nr 11. Funkcje

ZASADY PROGRAMOWANIA KOMPUTERÓW

Microsoft IT Academy kurs programowania

( wykł. dr Marek Piasecki )

Funkcja (podprogram) void

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Podstawy Programowania Podstawowa składnia języka C++

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

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

Wskaźniki. Informatyka

Język ludzki kod maszynowy

2 Przygotował: mgr inż. Maciej Lasota

Programowanie i struktury danych

Zofia Kruczkiewicz, Programowanie obiektowe - java, wykład 2 1

Wskaznik. Przekazywanie wyniku funkcji przez return. Typy i zmienne wskaznikowe. Zmienna wskazywana. typ * nazwa_wkaznika

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Programowanie komputerowe. Zajęcia 4

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

Programowanie strukturalne i obiektowe

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Podstawy programowania w języku C++

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

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

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

Wskaźniki w C. Anna Gogolińska

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

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

Szablony funkcji i szablony klas

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

PROGRAMOWANIE OBIEKTOWE W C++ cz. 2. Dziedziczenie, operacje wej cia-wyj cia, przeładowanie operatorów.

Języki programowania - podstawy

Wyklad 7 Funkcje (c.d.). Tablice jednowymiarowe znaków

C-struktury wykład. Dorota Pylak

Podstawy Programowania C++

Języki programowania obiektowego Nieobiektowe elementy języka C++

Strategia "dziel i zwyciężaj"

Dynamiczne struktury danych

Kontrola przebiegu programu

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Język C++ zajęcia nr 2

TEMAT : KLASY DZIEDZICZENIE

Ćwiczenie nr 3. Temat: Definicje i wykorzystanie funkcji, parametry funkcji

Algorytmy i język C++

Programowanie w języku C++

Część 4 życie programu

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur.

Programowanie I C / C++ laboratorium 03 arytmetyka, operatory

Transkrypt:

Wykład 6_ Abstrakcyjne typy danych stos Realizacja tablicowa i za pomocą rekurencyjnych typów danych Abstrakcyjny typ danych Klient korzystający z abstrakcyjnego typu danych: o ma do dyspozycji jedynie operacje typu wstaw(), usun(), wyszukaj() itp., o natomiast nie ma wglądu na typy danych, które w rzeczywistości zastosowano do przechowywania danych o nawet, jeśli zmieni się implementacja abstrakcyjnego typu danych a nagłówki funkcji nie zostaną zmienione, programy korzystające z tego typu pozostają bez zmian.. Stos algorytm Stos jest jednym z najważniejszych typów danych, które wstawiają i usuwają dane ze zbioru danych Przykłady zastosowań stosu: obliczanie wyrażenia postfiksowego, wyrażenia infiksowe (dwa stosy), przekształcenia wyrażenia infiksowego w postfiksowe itp Etap - Opis ADT Nazwa typu: Stos elementów Własności typu: Potrafi przechować ciąg elementów o dowolnym rozmiarze Dostępne działania: Inicjalizacja stosu Określenie, czy stos jest pusty Dodanie elementu do stosu, Usuwanie ze stosu, Etap - Budowa interfejsu typedef int dane; typ informacji umieszczanej na stosie typedef struct ELEMENT* stos; typ wskazania na element stosu struct ELEMENT typ elementu stosu dane Dane; stos Nastepny; ; Autor: Zofia Kruczkiewicz, p.35 C3 USM, Algorytmy i struktury danych, Wykład 6_

void Inicjalizacja(stos & Stos); działanie: inicjuje stos warunki wstępne: Stos wskazuje na pierwszy element warunki końcowe: stos zostaje zainicjowany jako pusty inline int Pusty(stos Stos) return Stos==; działanie: określa, czy stos jest pusty; typ inline, bo często wywoływana warunki wstępne: Stos jest zainicjowany, warunki końcowe: funkcja zwraca, jeśli stos pusty, w przeciwnym wypadku 0 int Wstaw( stos& Stos, dane Dana); działanie: dodaje element na początek ciągu, zwany szczytem stosu Stos warunki początkowe: Dana jest daną do wstawienia na szczyt zainicjowanego stosu warunki końcowe: jeśli to możliwe, funkcja dodaje daną Dana na szczyt stosu i zwraca wartość, w przeciwnym wypadku 0 dane Usun(stos& Stos); działanie: jeśli stos nie jest pusty, usuwa element ze szczytu stosu, czyli element ostatnio wstawiony do stosu warunki początkowe: Stos jest zainicjowanym niepustym stosem warunki końcowe: funkcja usuwa element na szczycie stosu i zwraca umieszczoną tam daną Autor: Zofia Kruczkiewicz, p.35 C3 USM, Algorytmy i struktury danych, Wykład 6_

Etap 3. Implementacja stosu za pomocą rekurencyjnej struktury danych void Inicjalizacja(stos& Stos) Stos = ; wstawianie elementów zawsze na początek struktury Stos A B Nowy Z Nowy Stos Z A B int Wstaw(stos& Stos, dane Dana) stos Nowy; Nowy = new ELEMENT; if (!Pusty(Nowy)) Nowy->Dane=Dana; else return 0; Nowy->Nastepny= Stos; Stos= Nowy; return ; usuwanie elementów zawsze na początku struktury Pom Stos Z A B Pom Stos Z A B dane Usun(stos& Stos) stos Pom; dane d; Pom = Stos; //zapamiętanie pierwszego elementu do usunięcia Stos = Stos->Nastepny; //odłączenie pierwszego elementu od listy d= Pom->Dane; //((*Pom).Dane) delete Pom; //usunięcie pierwszego elementu z pamięci return d; Autor: Zofia Kruczkiewicz, p.35 C3 3 USM, Algorytmy i struktury danych, Wykład 6_

Obliczanie wyrażeń postfiksowych za pomocą stosu Wyrażenie infiksowe (((+)*(3*))+(5*)) Wyrażenie postfiksowe + 3 **5 *+ Obliczanie wyrażenia postfiksowego + 3 **5 *+ (+ ) 3 **5 *+ 3 (3*)* 5 *+ (3* ) 5 *+ 36 (5 * ) + 36 + 0 6 Algorytm obliczania wyrażenia postfiksowego Ustaw i=0 Wykonuj, co następuje, aż zostaną wyczerpane znaki wyrażenia postfiksowego:.. Jeśli znakiem wyrażenia jest operator, to Usun ze stosu dwie kolejne dane, wykonaj działanie zgodne z operatorem i Wstaw wynik na stos o Jeśli znakiem jest cyfra, Wstaw na stos wartość 0 o Dopóki i-tym znakiem jest cyfra, wykonuj //oblicza wartość argumentu Usun ze stosu daną i pomnóż przez 0 oraz dodaj do tego wyniku wartość liczby jako jednocyfrowej wartości Wstaw tę wartość na stos Zwiększ licznik znaków wyrażenia o, i++.. Zwiększ licznik znaków wyrażenia o, i++ //opuszcza spację Operator Obliczenia Stos 3 + +=3 3 3 * *3= 3 3 * *3=36 36 5 36 * *5=0 36 0 36 + 0+36=6 6 Autor: Zofia Kruczkiewicz, p.35 C3 USM, Algorytmy i struktury danych, Wykład 6_

#include <conio.h> #include <stdlib.h> #include <string.h> #include <stdio.h> Przykład programu //. interfejs ADT stosu typedef int dane; typedef struct ELEMENT* stos; struct ELEMENT dane Dane; stos Nastepny; ; //funkcje ADT stosu void Inicjalizacja(stos& Stos); inline int Pusty(stos Stos); int Wstaw(stos& Stos, dane Dana); dane Usun(stos& Stos); // dane umieszczone stosie //nazwa wskaźnika na element stosu //. funkcje we/wy dla danych umieszczonych na stosie void Pokaz_dane (dane Dana); //funkcja do wyświetlania danej dane Dane(); // funkcja do wprowadzania danej //3. funkcje ogolnego przeznaczenia void Komunikat(char*); //funkcja do wyświetlania komunikatów char Menu(const int ile, char *Polecenia[]); //funkcja do wyświetlania tablicy //łańcuchów zawierających menu programu i zwracająca naciśniety klawisz //. elementy programu const int Esc=7; const int POZ=5; char * Tab_menu[POZ] = " : Wstawianie do stosu- na poczatek", " : Usuwanie ze stosu-na poczatku", "3 : Wydruk stosu wraz z jego usuwaniem", " : Obliczanie wyrazenia postfiksowego", " >Esc Koniec programu"; //funkcja klienta korzystające ze stosu void Wyswietl_usun_ze_stosu(stos& Stos); //wyświetlanie stosu dane Oblicz(char* w, stos& Stos); //zastosowanie stosu do obliczenia wyrażenia //postfiksowego void main(void) Autor: Zofia Kruczkiewicz, p.35 C3 5 USM, Algorytmy i struktury danych, Wykład 6_

stos Stos; char Wybor; char w[9]= '5',' ','9','',' ','8','',' ','+','',' ','6',' ','*','*','7',' ','+','*'; dane Dana; clrscr(); Inicjalizacja(Stos); do Wybor= Menu(POZ, Tab_menu); switch (Wybor) case '' : Dana=Dane(); if (Wstaw(Stos, Dana)==0) Komunikat("Brak pamieci\n"); break; case '' : if (Pusty(Stos)) Komunikat("\nStos pusty\n"); else (Usun(Stos)); break; case '3' : if (Pusty(Stos)) Komunikat("\nStos pusty\n") ; else Wyswietl_usun_ze_stosu(Stos); break; case '' : printf("\n%d\n", Oblicz(w, Stos)); getch(); while (Wybor!=Esc ); //**************funkcje klienta korzystające ze stosu*********** void Wyswietl_usun_ze_stosu(stos& Stos) dane d; while (!Pusty(Stos)) d=usun(stos); Pokaz_dane(d); Autor: Zofia Kruczkiewicz, p.35 C3 6 USM, Algorytmy i struktury danych, Wykład 6_

dane Oblicz(char* w, stos& Stos) //wg Robert Sedgewick Algorytmy w C++ for ( int i=0;i<9; i++) if (w[i]=='+') Wstaw(Stos,Usun(Stos)+Usun(Stos)); if (w[i]=='*') Wstaw(Stos,Usun(Stos)*Usun(Stos)); if (w[i]>='0' && w[i]<='9') Wstaw(Stos,0); while(w[i]>='0' && w[i]<='9') Wstaw(Stos,0*Usun(Stos)+(w[i++]-'0')); return Usun(Stos); //*********funkcje interfejsu ADT stosu************ void Inicjalizacja(stos& Stos) Stos = ; inline int Pusty(stos Stos) return Stos==; int Wstaw(stos& Stos, dane Dana) stos Nowy; Nowy = new ELEMENT; if (!Pusty(Nowy)) Nowy->Dane=Dana; else return 0; Nowy->Nastepny= Stos; Stos= Nowy; return ; dane Usun(stos& Stos) stos Pom; dane d; Pom = Stos; Stos = Stos->Nastepny; d= Pom->Dane; //((*Pom).Dane) delete Pom; return d; Autor: Zofia Kruczkiewicz, p.35 C3 7 USM, Algorytmy i struktury danych, Wykład 6_

//*********funkcje ogólnego przeznaczenia************ char Menu(const int ile, char *Polecenia[]) clrscr(); for (int i=0; i<ile;i++) printf("\n%s",polecenia[i]); return getch(); void Komunikat(char* s) printf(s); getch(); //*******funkcje we/wy dla danych umieszczonych na stosie********* dane Dane() int a; do fflush(stdin); printf("\n\npodaj dane typu int: "); while (scanf("%d",&a)!=); return a; void Pokaz_dane(dane Dana) printf("\nnumer: %d\n", Dana); printf("nacisnij dowolny klawisz...\n"); getch(); Autor: Zofia Kruczkiewicz, p.35 C3 8 USM, Algorytmy i struktury danych, Wykład 6_

Etap 3. Implementacja stosu za pomocą tablicy wstawianie Stos Wstawianie do stosu -przed pierwszy 5 N tab 0 dane. Stos.pierwszy<N. int pierwszy=stos.pierwszy 3 Stos Wstawianie do stosu - po pierwszy 3 5 N tab 0 3 dane 3. Stos.tab[pierwszy]= Dana;. Stos.pierwszy++; 5. Stos.pierwszy!=0 int Wstaw(stos& Stos, dane Dana) if (Stos.pierwszy==N) return 0; //nie można wstawić do stosu, gdy jest pełen int pierwszy=stos.pierwszy++; Stos.tab[pierwszy]= Dana; return ; Autor: Zofia Kruczkiewicz, p.35 C3 9 USM, Algorytmy i struktury danych, Wykład 6_

Usuwanie ze stosu Stos Usuwanie do stosu - przed pierwszy tab 0 3 N 5 Dana. Stos.pierwszy!=0 3 Stos Usuwanie do stosu - po pierwszy tab 0 5 N Dana. int pierwszy=--stos.pierwszy 3. Dana=Stos.tab[pierwszy] 3 dane Usun(stos& Stos) dane d; int pierwszy= --Stos.pierwszy; //wyznaczenie indeksu elementu usuwanego ze stosu d= Stos.tab[pierwszy]; return d; Autor: Zofia Kruczkiewicz, p.35 C3 0USM, Algorytmy i struktury danych, Wykład 6_

Implementacja stosu za pomocą tablicy #include <conio.h> #include <stdlib.h> #include <string.h> #include <stdio.h> //. interfejs ADT stosu typedef int dane; // dane umieszczone stosie const long N=0; //rozmiar stosu struct stos //typ struktury stosu int pierwszy; //liczba elementów dane tab[n]; //tablica danych ; // interfejs stosu się nie zmienił, definicja zmieniła się!!! void Inicjalizacja(stos& Stos); inline int Pusty(stos Stos); int Wstaw(stos& Stos, dane Dana); dane Usun(stos& Stos); // Te funkcje się nie zmieniły ani nagłówki, ani definicja!!! //. funkcje we/wy dla danych umieszczonych na stosie void Pokaz_dane (dane Dana); dane Dane(); //3. funkcje ogolnego przeznaczenia void Komunikat(char*); char Menu(const int ile, char *Polecenia[]); //. elementy programu const int Esc=7; const int POZ=5; char * Tab_menu[POZ] = " : Wstawianie do stosu- na poczatek", " : Usuwanie ze stosu-na poczatku", "3 : Wydruk stosu wraz z jego usuwaniem", " : Obliczanie wyrazenia postfiksowego", " >Esc Koniec programu"; //funkcje klienta korzystajace ze stosu void Wyswietl_usun_ze_stosu(stos& Stos); dane Oblicz(char* w, stos& Stos); Autor: Zofia Kruczkiewicz, p.35 C3 USM, Algorytmy i struktury danych, Wykład 6_

void main(void) //tekst funkcji main się nie zmienił stos Stos; char Wybor; char w[9]='5',' ','9','',' ','8','',' ','+','',' ','6',' ','*','*','7',' ','+','*'; dane Dana; clrscr(); Inicjalizacja(Stos); do Wybor= Menu(POZ, Tab_menu); switch (Wybor) case '' : Dana= Dane(); if (Wstaw(Stos, Dana)==0) Komunikat("Brak pamieci\n"); break; case '' : if (Pusty(Stos)) Komunikat("\nStos pusty\n"); else (Usun(Stos)); break; case '3' : if (Pusty(Stos)) Komunikat("\nStos pusty\n") ; else Wyswietl_usun_ze_stosu(Stos); break; case '' : printf("\n%d %d\n",oblicz(w, Stos)); getch(); while (Wybor!=Esc ); //*********funkcje interfejsu ADT stosu************ void Inicjalizacja(stos& Stos) Stos.pierwszy = 0; inline int Pusty(stos Stos) return Stos.pierwszy==0; //stos jest pusty, gdy liczba elementów jest równa zero int Wstaw(stos& Stos, dane Dana) if (Stos.pierwszy==N) return 0; //nie można wstawić do stosu, gdy jest pełen int pierwszy=stos.pierwszy++; Stos.tab[pierwszy]= Dana; return ; dane Usun(stos& Stos) dane d; int pierwszy= --Stos.pierwszy; //wyznaczenie indeksu elementu usuwanego ze stosu d= Stos.tab[pierwszy]; return d; Autor: Zofia Kruczkiewicz, p.35 C3 USM, Algorytmy i struktury danych, Wykład 6_

. Pojęcie rekurencyjnych typów danych. Klasyfikacja struktur danych 3. Pojęcie abstrakcyjnego typu danych Podsumowanie. Pojęcie rekurencyjnych typów danych Przykład (Wirth N. Algorytmy + Struktury Danych = Programy, WNT 989) a) deklaracja modelu drzewa dziedziczenia: type osoba = record if znany then ( imię : alfa; ojciec, matka: osoba) end; b) opis reprezentacji zmiennej rodowód typu osoba: jeśli znany = False, to istnieje tylko pole znacznikowe znany równe False (F) jeśli znany = True (T), to istnieją jeszcze trzy pola (imię, ojciec, matka) c) przypadek danych: rodowód = (True, Jan, (True, Marek, (True, Adam, (False), (False) ), (False) ), (True, Maria, (False), (True, Ewa, (False), (False) ) ) ) Autor: Zofia Kruczkiewicz, p.35 C3 3USM, Algorytmy i struktury danych, Wykład 6_

. Klasyfikacja struktur danych Struktury danych można podzielić na: ) typy wymagające deklarowania rozmiarów - realizowane jako tablice lub struktury z bezpośrednim dostępem do każdego elementu tych struktur za pomocą operatorów indeksowania [ ] lub wyboru: -> oraz. ) typy nie wymagające deklarowania rozmiarów - rekurencyjne typy danych realizowane jako dynamiczne struktury danych z pośrednim dostępem do ich elementów. Rekurencyjny typ danych:.) zawiera elementy jako struktury.) używa wskaźników do wskazania następnego elementu typu,.3) używa dynamicznego przydziału pamięci dla swoich elementów.) algorytm dostępu do poszczególnych składowych tej struktury określa programista dzięki jawnemu użyciu wskaźników. ) uporządkowane: jako kryterium wstawiania danych do struktury jest ich wartość: drzewa poszukiwań binarnych, listy posortowane 3) nieuporządkowane: kryterium wstawiania danych do struktury dotyczy priorytetu danych: stosy, kolejki, listy nieposortowane, drzewa, grafy Dynamiczne przydzielanie pamięci zmiennej typ* p=new typ. P *P Wskaźnikowy model rekurencyjnych typów danych: Przykład Wskaźnikowy model rodowodu a) deklaracja typu struct osoba char imie [0]; osoba* ojciec, *matka; ; wskaźnikowa struktura rodowodu osoba* Poczatek; Poczatek Jan Marek Maria Adam Ewa Autor: Zofia Kruczkiewicz, p.35 C3 USM, Algorytmy i struktury danych, Wykład 6_

. Abstrakcyjne typy danych 3..Główne cechy typów danych stosowanych w programach: ) muszą być dostosowane do rozwiązywanego problemu ) muszą zawierać dwa rodzaje informacji:.) zbiór własności.) zbiór działań. Np. typ int własności: reprezentuje liczby całkowite o wartościach od -3768 do +3767 zakodowanych w kodzie dwójkowym na dwóch bajtach działania: zmiana znaku, dodawanie, mnożenie, dzielenie, modulo... 3.. Trzy etapy procesu definiowania typów przez programistę [wg Stephen Prata - Szkoła programowania, Język C]: Przygotowanie opisu ADT (abstrakcyjnego typu danych). Abstrakcyjny opis obejmuje własności typu i operacji, jakie można na nim wykonać. Opis ten nie powinien być związany z żadną konkretną implementacją i językiem programowania. Ta formalna charakterystyka nosi nazwę abstrakcyjnego typu danych ADT. b) Opracowanie interfejsu programistycznego realizującego ADT - Jest to wskazanie sposobu przechowywania danych i opisanie zbioru funkcji wykonujących potrzebne operacje. W języku C/C++ etap ten może polegać na utworzeniu definicji struktury i prototypów funkcji przetwarzających. Funkcje te pełnią dla nowego typu tę samą rolę, co operatory w przypadku podstawowych typów języka C/C++. Utworzony interfejs będzie stosowany przez osoby, które chcą skorzystać z nowego typu danych Pisanie kodu implementującego interfejs Ten krok jest kluczowy, w którym należy szczegółowo zrealizować wymagania wynikające z opisu. Należy zauważyć, że programista korzystający z interfejsu nie musi już orientować się w szczegółach implementacji 3.3 Podsumowanie: Programista korzystający z abstrakcyjnego typu danych: może wielokrotnie używać utworzony typ danych w programach ma do dyspozycji jedynie operacje typu wstaw(...), usun(...), wyszukaj(...) natomiast nie ma wglądu na typy danych, które w rzeczywistości zastosowano do przechowywania danych dlatego nawet, jeśli zmieni się implementacja abstrakcyjnego typu danych a nagłówki funkcji nie zostaną zmienione, programy źródłowe korzystające z tego typu pozostają bez zmian. Autor: Zofia Kruczkiewicz, p.35 C3 5USM, Algorytmy i struktury danych, Wykład 6_