Wykład 7 Abstrakcyjne typy danych kolejka priorytetowa

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 6_1 Abstrakcyjne typy danych stos Realizacja tablicowa i za pomocą rekurencyjnych typów danych

1. Abstrakcyjne typy danych

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

Algorytmy i Struktury Danych

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

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

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

Wykład 9 - struktury rekurencyjne uporządkowane

// dane umieszczone liście. Autor: Zofia Kruczkiewicz, p.325 C3 1 USM, Algorytmy i struktury danych, Wykład 8

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

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

E S - uniwersum struktury stosu

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

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

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

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

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

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

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

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

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

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

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

int tab_a [ 2 ] [ 3 ];

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

Struktury danych: stos, kolejka, lista, drzewo

tablica: dane_liczbowe

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

Programowanie Proceduralne

Wstęp do programowania 1

Dynamiczne struktury danych

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

Wykład 1 Wprowadzenie do algorytmów. Zawartość wykładu 1. Wstęp do algorytmów i struktur danych 2. Algorytmy z rozgałęzieniami.

Kontrola przebiegu programu

Algorytmy i Struktury Danych.

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

Wstęp do programowania

Szablony klas, zastosowanie szablonów w programach

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

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

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

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

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

Algorytm selekcji Hoare a. Łukasz Miemus

Strategia "dziel i zwyciężaj"

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

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

Wykłady opracowane zostały w oparciu o materiały prof. dr hab. Jerzego Weresa. Poznań 2009/2010 Algorytmy i struktury danych Krzysztof Nowakowski 2

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)

Zofia Kruczkiewicz, Algorytmu i struktury danych, Wykład 14, 1

Rekurencja. Dla rozwiązania danego problemu, algorytm wywołuje sam siebie przy rozwiązywaniu podobnych podproblemów. Przykład: silnia: n! = n(n-1)!

Drzewa wyszukiwań binarnych (BST)

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

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Sortowanie. Bartman Jacek Algorytmy i struktury

Definicja. Ciąg wejściowy: Funkcja uporządkowująca: Sortowanie polega na: a 1, a 2,, a n-1, a n. f(a 1 ) f(a 2 ) f(a n )

Wskaźniki. Programowanie Proceduralne 1

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

- - Ocena wykonaniu zad3. Brak zad3

funkcje rekurencyjne Wykład 12. Podstawy programowania (język C) Funkcje rekurencyjne (1) Funkcje rekurencyjne (2)

Funkcja (podprogram) void

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

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

Laboratorium nr 7 Sortowanie

Zmienne i struktury dynamiczne

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

Struktury. Przykład W8_1

Podstawowe algorytmy i ich implementacje w C. Wykład 9

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

Wstęp do wiadomości teoretycznych (nie, nie jest to masło maślane ani wstęp, wstępów proszę cierpliwie czytać)

Podstawy Programowania 2 Dwukierunkowa lista liniowa. Plan. Wstęp. Implementacja. Notatki. Notatki. Notatki. Notatki.

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

Algorytmy i Struktury Danych.

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

Algorytmy i struktury danych. Wykład 6 Tablice rozproszone cz. 2

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

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

Podstawowe struktury danych

Wstęp do programowania 1

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

Sortowanie - wybrane algorytmy

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

Podstawy programowania w języku C++

Lista dwukierunkowa - przykład implementacji destruktorów

ALGORYTMY I STRUKTURY DANYCH

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

Programowanie Proceduralne

Pętle while, for, do while, instrukcje break, continue, switch 1. Pętle

Wstęp do programowania

EGZAMIN - Wersja A. ALGORYTMY I STRUKTURY DANYCH Lisek89 opracowanie kartki od Pani dr E. Koszelew

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

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

Podstawy Programowania. Listy i stosy

część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia

Kolokwium ze wstępu do informatyki, I rok Mat. (Ściśle tajne przed godz. 10 : grudnia 2005.)

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

Podstawy algorytmiki i programowania - wykład 6 Sortowanie- algorytmy

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

Transkrypt:

Wykład 7 Abstrakcyjne typy danych kolejka priorytetowa Definicja kolejki priorytetowej: Kolejka priorytetowa to struktura danych zawierająca elementy z kluczami, która pozwala na przeprowadzanie dwóch podstawowych operacji: wstawiania nowego elementu i usuwania elementu o największej wartości (R.Sedgewick,Algorytmy w C++) Zastosowania kolejki priorytetowej (wg R.Sedgewick,Algorytmy w C++) Systemy symulacyjne, w których dane kolejki mogą odpowiadać czasom wystąpienia zdarzeń przeznaczonych do chronologicznego przetwarzania Planowanie zadań w systemach komputerowych dane kolejki mogą oznaczać priorytety wskazujące, którzy użytkownicy mają być obsługiwania w pierwszej kolejności Obliczenia numeryczne, gdzie klucze mogą być wartościami błędów obliczeniowych, oznaczającymi, że największy powinien zostać obsłużony jako pierwszy Autor: Zofia Kruczkiewicz, p.35 C3 USM, Algorytmy i struktury danych, Wykład 7

Etap - Opis ADT Nazwa typu: Własności typu: Kolejka priorytetowa Kolejka elementów Potrafi przechować ciąg elementów usuwa zawsze największy element Dostępne działania: Inicjalizacja kolejki priorytetowej Określenie, czy kolejka priorytetowa jest pusta Dodanie elementu do kolejki priorytetowej, Usuwanie z kolejki priorytetowej największego elementu Etap - Budowa interfejsu void Inicjalizacja(kolejka_p& Kolejka_P); { działanie: inicjuje kolejkę priorytetową warunki wstępne: Kolejka_P jest pustą kolejką priorytetową warunki końcowe: kolejka priorytetowa zostaje zainicjowana jako pusta inline int Pusty(kolejka_p Kolejka_P); {działanie: określa, czy kolejka priorytetowa jest pusta; typ inline, bo często wywoływana warunki wstępne: Kolejka_P jest zainicjowana, warunki końcowe: funkcja zwraca, jeśli kolejka priorytetowa jest pusta, jeśli nie- 0 int Wstaw(kolejka_p& Kolejka_P, dane Dana); { działanie: dodaje element w dowolny sposób do kolejki priorytetowej warunki początkowe: Dana jest daną do wstawienia do zainicjowanej kolejki priorytetową Kolejka_P warunki końcowe: jeśli jest to możliwe, funkcja dodaje daną Dana do kolejki priorytetową i zwraca, w przeciwnym wypadku 0 int Usun(kolejka_p& Kolejka_P); { działanie: usuwa największy element wstawiony do kolejki priorytetowej, warunki początkowe: Kolejka_P jest niepustą kolejką priorytetową warunki końcowe: usuwa element największy z kolejki priorytetowej i zwraca dane przez return. Po usuwaniu kolejka może być pusta i musi być zainicjowana Autor: Zofia Kruczkiewicz, p.35 C3 USM, Algorytmy i struktury danych, Wykład 7

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

Usuwanie z kolejki priorytetowej Kolejka_P Usuwanie z kolejki priorytetowej -przed pierwszy tab 0 3 4 3 4 5 N max. Kolejka_P.pierwszy!=0 Wyszukanie największego elementu o indeksie maxind. max=kolejka_p.tab[maksind] Kolejka_P Usuwanie z kolejki priorytetowej - po pierwszy tab 0 4 4 5 N max 3. Kolejka_P.tab[maxind]= Kolejka_P.tab[--Kolejka_P.pierwszy]; return max 3 4 dane Usun_max(kolejka_p& Kolejka_P) { int maxind=0; for (int i=; i< Kolejka_P.pierwszy; i++) if (Kolejka_P.tab[i] > Kolejka_P.tab[maxind]) maxind = i; dane max = Kolejka_P.tab[maxind]; //zapisanie w miejscu pobranego elementu ostatniego z ciągu Kolejka_P.tab[maxind] = Kolejka_P.tab[--Kolejka_P.pierwszy]; return max; //zwrócenie największego elementu //wyszukanie największego elementu //pobranie największego elementu Autor: Zofia Kruczkiewicz, p.35 C3 4 USM, Algorytmy i struktury danych, Wykład 7

#include <conio.h> #include <stdlib.h> #include <string.h> #include <stdio.h> //. interfejs ADT kolejki priorytetowej typedef int dane; // dane umieszczone w kolejce priorytetowej const long N=; struct stos { int pierwszy; dane tab[n]; ; typedef stos kolejka_p; //nowa nazwa wynikająca z przedefiniowanego //zastosowania danych i niektorych funkcji stosu //prototypy funkcji kolejki_prorytetowej void Inicjalizacja(kolejka_p& Kolejka_P); inline int Pusty(kolejka_p Kolejka_P); int Wstaw_p(kolejka_p& Kolejka_P, dane Dana); dane Usun_max(kolejka_p& Kolejka_P); //. funkcje we/wy dla danych umieszczonych w kolejce p. void Pokaz_dane (dane Dana); dane Dane(char* menu); //3. funkcje ogolnego przeznaczenia void Komunikat(char*); char Menu(const int ile, char *Polecenia[]); //4. elementy programu const int Esc=7; const int POZ=4; char * Tab_menu[POZ] = {" : Wstawianie do kolejki_p", " : Usuwanie z kolejki_p najwiekszego elementu", "3 : Wydruk kolejki_p nierosnaco wraz z jej usuwaniem", " >Esc Koniec programu"; //funkcje klienta korzystajace z kolejki priorytetowej void Wstaw_do_kol_p(kolejka_p& Kolejka_P); void Wyswietl_usun_z_kol_p(kolejka_p& Kolejka_P); Autor: Zofia Kruczkiewicz, p.35 C3 5 USM, Algorytmy i struktury danych, Wykład 7

void main(void) { kolejka_p Kolejka_P; char Wybor; clrscr(); Inicjalizacja(Kolejka_P); do { Wybor= Menu(POZ, Tab_menu); switch (Wybor) { case '' : Wstaw_do_kol_p(Kolejka_P); break; case '' : if (Pusty(Kolejka_P)) Komunikat("\nKolejka_p pusta\n"); else (Usun_max(Kolejka_P)); break; case '3' : if (Pusty(Kolejka_P)) Komunikat("\nKolejka_p pusta\n") ; else Wyswietl_usun_z_kol_p(Kolejka_P); break; while (Wybor!=Esc ); //***funkcje klienta korzystające z kolejki priorytetowej** void Wstaw_do_kol_p(kolejka_p& Kolejka_P) { dane Dana= Dane("Podaj dane do kolejki p: "); if (Wstaw_p(Kolejka_P, Dana)==0) Komunikat("Brak pamieci\n"); void Wyswietl_usun_z_kol_p(kolejka_p& Kolejka_P) {dane d; while (!Pusty(Kolejka_P)) { d=usun_max(kolejka_p); Pokaz_dane(d); Autor: Zofia Kruczkiewicz, p.35 C3 USM, Algorytmy i struktury danych, Wykład 7

//*********funkcje interfejsu ADT kolejki p************ void Inicjalizacja(kolejka_p& Kolejka_P) { Kolejka_P.pierwszy = 0; inline int Pusty(kolejka_p Kolejka_P) { return Kolejka_P.pierwszy==0; int Wstaw_p(kolejka_p& Kolejka_P, dane Dana) { if (Kolejka_P.pierwszy==N) return 0; Kolejka_P.tab[Kolejka_P.pierwszy++]= Dana; //dodanie elementu na końcu ciągu return ; dane Usun_max(kolejka_p& Kolejka_P) { int maxind=0; for (int i=; i< Kolejka_P.pierwszy; i++) if (Kolejka_P.tab[i] > Kolejka_P.tab[maxind]) maxind = i; dane max = Kolejka_P.tab[maxind]; //zapisanie w miejscu pobranego elementu ostatniego z ciągu Kolejka_P.tab[maxind] = Kolejka_P.tab[--Kolejka_P.pierwszy]; return max; //zwrócenie największego elementu //wyszukanie największego elementu //pobranie największego elementu //*********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 w kolejce p********* dane Dane(char* menu) { int a; do { fflush(stdin); printf("\n\n%s",menu); 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 7 USM, Algorytmy i struktury danych, Wykład 7

Etap 3 - Implementacja za pomocą tablicy - kopca Przykład: Należy wstawić dany ciąg wejściowy do tablicy kopca, czyli ustawić elementy w ciągu, aby wartość każdego elementu o numerze i (element zwany ojcem ) była nie mniejsza niż wartość elementów o numerach: i ( element lewy ) oraz i + (element prawy ). Numery elementów 4 5 7 wartości 3 3 3 4 4 elementów Zadanie : Utwórz kopiec metodą wstępującą 3 3 4 4 3 3 3 3 3 4 5 3 3 4 5 4 3 4 4 5 3 3 4 4 5 3 7 3 4 3 4 4 4 4 5 3 7 4 5 4 3 3 7 4 5 3 3 3 7 4 Uwaga : Ciąg przekształcony w kopiec. W ciągu typu kopiec element o największej wartości znajduje się na pierwszej pozycji: Numery elementów 4 5 7 Autor: Zofia Kruczkiewicz, p.35 C3 USM, Algorytmy i struktury danych, Wykład 7

wartości elementów 4 4 3 3 3 Zadanie : Należy kolejno usuwać kolejne elementy największe z kolejki priorytetowej za pomocą przesiewania zstępującego czyli zamiany największego elementu z początku kopca z elementem ostatnim w kopcu i odbudowy kopca z pozostałych elementów. Następnie można ten ostatni element usunąć kolejki priorytetowej. Proces ten należy powtarzać N razy, gdzie N jest liczbą elementów ciągu. 4 4 4 5 7 3 3 3 ) 4 4 4 5 7 3 3 3 4 4 4 5 7 3 3 3 4 3 4 4 5 7 3 ) 3 4 4 5 7 3 4 4 3 4 5 7 3 4 4 3 3 4 5 7 4 Autor: Zofia Kruczkiewicz, p.35 C3 9 USM, Algorytmy i struktury danych, Wykład 7

3) 3 3 3 3 3 3 3 4 5 7 4 5 7 4 5 7 4 4 4 4 4 4 4) 3 3 3 3 4 5 7 4 5 7 4 4 4 4 3 4 5 7 3 4 4 5) 4 5 7 3 3 4 4 3 4 5 7 3 3 4 4 ) 3 4 5 7 4 5 7 3 3 4 4 3 3 4 4 Autor: Zofia Kruczkiewicz, p.35 C3 0 USM, Algorytmy i struktury danych, Wykład 7

7) ) 4 5 7 3 3 4 4 4 5 7 3 3 4 4 Uwaga : Ciąg usuwanych elementów posiada własności kopca, gdzie element o numerze i jest mniejszy lub równy elementom o numerach *i oraz *i+. Autor: Zofia Kruczkiewicz, p.35 C3 USM, Algorytmy i struktury danych, Wykład 7

#include <conio.h> #include <stdlib.h> #include <string.h> #include <stdio.h> //. interfejs ADT stosu typedef int dane; // dane umieszczone stosie const long N=; struct stos { int pierwszy; dane tab[n]; ; typedef stos kolejka_p; //nowa nazwa wynikająca z przedefiniowanego //zastosowania danych i niektórych funkcji stosu //prototypy funkcji kolejki_prorytetowej void Inicjalizacja(kolejka_p& Kolejka_P); inline int Pusty(kolejka_p Kolejka_P); int Wstaw_p(kolejka_p& Kolejka_P, dane Dana); dane Usun_max(kolejka_p& Kolejka_P); //. funkcje we/wy dla danych umieszczonych w kolejce p. void Pokaz_dane (dane Dana); dane Dane(char* menu); //3. funkcje ogolnego przeznaczenia void Komunikat(char*); char Menu(const int ile, char *Polecenia[]); //4. elementy programu const int Esc=7; const int POZ=4; char * Tab_menu[POZ] = {" : Wstawianie do kolejki_p", " : Usuwanie z kolejki_p najwiekszego elementu", "3 : Wydruk kolejki_p nierosnaco wraz z jej usuwaniem", " >Esc Koniec programu"; //funkcje klienta korzystajace z kolejki priorytetowej void Wstaw_do_kol_p(kolejka_p& Kolejka_P); void Wyswietl_usun_z_kol_p(kolejka_p& Kolejka_P); Autor: Zofia Kruczkiewicz, p.35 C3 USM, Algorytmy i struktury danych, Wykład 7

void main(void) { kolejka_p Kolejka_P; char Wybor; clrscr(); Inicjalizacja(Kolejka_P); do { Wybor= Menu(POZ, Tab_menu); switch (Wybor) {case '' : Wstaw_do_kol_p(Kolejka_P); break; case '' : if (Pusty(Kolejka_P)) Komunikat("\nKolejka_p pusta\n"); else (Usun_max(Kolejka_P)); case '3' : break; if (Pusty(Kolejka_P)) Komunikat("\nKolejka_p pusta\n") ; else Wyswietl_usun_z_kol_p(Kolejka_P); break; while (Wybor!=Esc ); /*funkcje do przesiewania stogu w górę i w dół, pomocnicze dla kolejki priorytetowej szybkie znajdowanie elementu największego*/ inline void zamien(dane &a, dane &b) { dane pom=a; a=b; b=pom; //prostszy zapis funkcji do przesiewania zstępującego kopca void przywroc_kopiec_w_dol(dane t[], long p, long ojciec) {long maks,ll,pp; while (ojciec < p) { ll = *ojciec; //lewy nastepca ojca pp=ll+; //prawy nastepca ojca if (ll <= p && t[ll] > t[ojciec]) maks=ll; else maks=ojciec; if (pp <= p && t[maks] < t[pp]) maks=pp; if (maks!=ojciec) { zamien(t[maks],t[ojciec]); ojciec=maks; else break; Autor: Zofia Kruczkiewicz, p.35 C3 3 USM, Algorytmy i struktury danych, Wykład 7

//funkcja, która przesiewa kopiec wstępująco void przywroc_kopiec_w_gore(dane t[], long p, long ojciec) { while (ojciec>0 && t[ojciec/] < t[ojciec]) { zamien(t[ojciec/], t[ojciec]); ojciec=ojciec/; //********************************************************* //**funkcje interfejsu ADT kolejki p opartej na funkcjach stogu* void Inicjalizacja(kolejka_p& Kolejka_P) { Kolejka_P.pierwszy = 0; inline int Pusty(kolejka_p Kolejka_P) { return Kolejka_P.pierwszy==0; int Wstaw_p(kolejka_p& Kolejka_P, dane Dana) { if (Kolejka_P.pierwszy==N) return 0; //wstawianie jako do stosu, czyli na koniec kopca Kolejka_P.tab[Kolejka_P.pierwszy++]= Dana; przywroc_kopiec_w_gore(kolejka_p.tab, 0, Kolejka_P.pierwszy-); //wstawienie największego elementu na początek kopca return ; dane Usun_max(kolejka_p& Kolejka_P) { zamien(kolejka_p.tab[0], K Kolejka_P.tab[--Kolejka_P.pierwszy]); //największy element na koniec stogu przywroc_kopiec_w_dol(kolejka_p.tab, Kolejka_P.pierwszy-, 0); //odtworzenie stogu bez ostatniego elementu dane max= Kolejka_P.tab[Kolejka_P.pierwszy]; //pobranie największego elementu ze stogu return max; Autor: Zofia Kruczkiewicz, p.35 C3 4 USM, Algorytmy i struktury danych, Wykład 7

Etap 3. Implementacja kolejki priorytetowej za pomocą sortowanej listy wiązanej szukanie i wstawianie do listy w przed większym lub równym elementem lub na końcu listy, gdy nie znaleziono elementu równego lub większego (wynik funkcji Szukaj jest dowolny) ) Lista.Poczatek=NULL Nowy D Lista.Gdzie=NULL ) Lista.Poczatek=Nowy ) Nowy->Nastepny=Lista.Poczatek Nowy D NULL Lista.Poczate D Lista.Gdzie NULL Nowy A NULL Lista.Poczate D Lista.Gdzie Nowy A NULL ) Lista.Gdzie->Nastepny=Nowy Lista.Gdzie=NULL Lista.Poczate D Lista.Poczate Nowy Z D ) Nowy->Nastepny=Lista.Gdzie->Nastepny A Nowy NULL Z Lista.Gdzie=NULL A NULL ) Lista.Poczatek=Nowy ) Nowy->Nastepny=Lista.Poczatek Lista.Poczate Z D A NULL Nowy B Lista.Poczate Z Lista.Gdzie D Nowy B A NULL Lista.Gdzie ) Lista.Gdzie->Nastepny=Nowy ) Nowy->Nastepny=Lista.Gdzie->Nastepny Autor: Zofia Kruczkiewicz, p.35 C3 5 USM, Algorytmy i struktury danych, Wykład 7

int Szukaj(lista& Lista,dane Dana) {Lista.Gdzie = NULL; if (Pusty(Lista)) return 0; stos Nast = Lista.Poczatek; while ((Nast->Nastepny!=NULL) && Nast->Dane>Dana) { Lista.Gdzie= Nast; Nast = Nast->Nastepny; if (Nast->Dane> Dana) Lista.Gdzie= Nast; //wiec jest wstawiany na końcu if (Nast->Dane==Dana) return ; else return ; int Wstaw(lista& Lista, dane Dana) { stos Nowy = new ELEMENT; if (Nowy!=NULL) Nowy->Dane=Dana; else return 0; if (Lista.Gdzie==NULL) { Nowy->Nastepny= Lista.Poczatek; Lista.Poczatek= Nowy; else { Nowy->Nastepny = Lista.Gdzie->Nastepny; Lista.Gdzie->Nastepny = Nowy; return ; //wstawiany element jest najmniejszy, Autor: Zofia Kruczkiewicz, p.35 C3 USM, Algorytmy i struktury danych, Wykład 7

usuwanie elementów zawsze na początku kolejki priorytetowej posortowanej listy wiązanej Kolejka_P.Poczatek Pom D B A NULL Pom D B A NULL Kolejka_P.Poczatek /*interfejs ADT kolejki priorytetowej jako uporządkowanej listy wiązanej */ dane Usun_max(kolejka_p& Kolejka_P) //jak ze stosu-zdejmuje się największy element { stos Pom; //listy posortowanej nierosnąco dane d; Pom= Kolejka_P.Poczatek; Kolejka_P.Poczatek= Kolejka_P.Poczatek->Nastepny; //odłączenie pierwszego elementu od listy d=pom->dane; //((*Pom).Dane) delete Pom; //usunięcie pierwszego elementu z pamięci return d; //zapamiętanie pierwszego elementu do usunięcia int Wstaw_p(kolejka_p& Kolejka_P, dane Dana) nierosnąco { Szukaj(Kolejka_P, Dana); int a = Wstaw(Kolejka_P, Dana); return a; //powstaje lista posortowana void Inicjalizacja(kolejka_p& Kolejka_P) { Kolejka_P.Poczatek = NULL; inline int Pusty(kolejka_p Kolejka_P) { return Kolejka_P.Poczatek==NULL; Autor: Zofia Kruczkiewicz, p.35 C3 7 USM, Algorytmy i struktury danych, Wykład 7

#include <conio.h> #include <stdio.h> //. interfejs ADT kolejki priorytetowej jako uporządkowanej listy //wiązanej typedef int dane; // dane umieszczone liście typedef struct ELEMENT* stos; // nazwa wskaźnika na element stosu struct ELEMENT //element listy { dane Dane; stos Nastepny; ; struct lista //typ listy wiązana uporządkowana { stos Poczatek; stos Gdzie; ; typedef lista kolejka_p; //nowa nazwa wynikająca z przedefiniowanego //zastosowania danych i niektórych funkcji listy //prototypy funkcji kolejki_prorytetowej void Inicjalizacja(kolejka_p& Kolejka_p); inline int Pusty(kolejka_p Kolejka_p); int Wstaw_p(kolejka_p& Kolejka_P, dane Dana); dane Usun_max(kolejka_p& Kolejka_P); //. funkcje we/wy dla danych umieszczonych na liście void Pokaz_dane (dane Dana); dane Dane(char* s); //3. funkcje ogolnego przeznaczenia void Komunikat(char*); char Menu(const int ile, char *Polecenia[]); //4. elementy programu const int Esc=7; const int POZ=4; char * Tab_menu[POZ] = {" : Wstawianie do kolejki_p", " : Usuwanie z kolejki_p najwiekszego elementu", "3 : Wydruk kolejki_p nierosnaco wraz z jej usuwaniem", " >Esc Koniec programu"; Autor: Zofia Kruczkiewicz, p.35 C3 USM, Algorytmy i struktury danych, Wykład 7

//funkcje klienta korzystajace z kolejki priorytetowej void Wstaw_do_kol_p(kolejka_p& Kolejka_P); void Wyswietl_usun_z_kol_p(kolejka_p& Kolejka_P); void main(void) { kolejka_p Kolejka_P; char Wybor; clrscr(); Inicjalizacja(Kolejka_P); do { Wybor= Menu(POZ, Tab_menu); switch (Wybor) {case '' : Wstaw_do_kol_p(Kolejka_P); break; case '' : if (Pusty(Kolejka_P)) Komunikat("\nKolejka_p pusta\n"); else (Usun_max(Kolejka_P)); break; case '3' : if (Pusty(Kolejka_P)) Komunikat("\nKolejka_p pusta\n") ; else Wyswietl_usun_z_kol_p(Kolejka_P); break; while (Wybor!=Esc ); /*pomocnicze funkcje dla kolejki priorytetowej jako uporządkowanej listy wiazanej*/ int Szukaj(lista& Lista,dane Dana) {Lista.Gdzie = NULL; if (Pusty(Lista)) return 0; stos Nast = Lista.Poczatek; while ((Nast->Nastepny!=NULL) && Nast->Dane>Dana) { Lista.Gdzie= Nast; Nast = Nast->Nastepny; if (Nast->Dane> Dana) //wstawiany element jest najmniejszy, Lista.Gdzie= Nast; //wiec jest wstawiany na koncu if (Nast->Dane==Dana) return ; else return ; int Wstaw(lista& Lista, dane Dana) { stos Nowy = new ELEMENT; if (Nowy!=NULL) Nowy->Dane=Dana; else return 0; if (Lista.Gdzie==NULL) { Nowy->Nastepny= Lista.Poczatek; Lista.Poczatek= Nowy; else { Nowy->Nastepny = Lista.Gdzie->Nastepny; Lista.Gdzie->Nastepny = Nowy; return ; Autor: Zofia Kruczkiewicz, p.35 C3 9 USM, Algorytmy i struktury danych, Wykład 7

/*interfejs ADT kolejki priorytetowej jako uporządkowanej listy wiązanej */ void Inicjalizacja(kolejka_p& Kolejka_P) { Kolejka_P.Poczatek = NULL; inline int Pusty(kolejka_p Kolejka_P) { return Kolejka_P.Poczatek==NULL; int Wstaw_p(kolejka_p& Kolejka_P, dane Dana) { Szukaj(Kolejka_P, Dana); int a = Wstaw(Kolejka_P,Dana); return a; //powstaje lista posortowana nierosnąco dane Usun_max(kolejka_p& Kolejka_P) //jak ze stosu-zdejmuje się największy element { stos Pom; //listy posortowanej nierosnąco dane d; Pom= Kolejka_P.Poczatek; Kolejka_P.Poczatek= Kolejka_P.Poczatek->Nastepny; d=pom->dane; delete Pom; return d; //****funkcje klienta korzystające z kolejki priorytetowej**** void Wstaw_do_kol_p(kolejka_p& Kolejka_P) { dane Dana= Dane("Podaj dane: "); { if (!Wstaw_p(Kolejka_P, Dana)) Komunikat("\nBrak pamieci"); void Wyswietl_usun_z_kol_p(kolejka_p& Kolejka_P) {dane d; while (!Pusty(Kolejka_P)) { d=usun_max(kolejka_p); Pokaz_dane(d); //*********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 kolejce priorytetowej dane Dane(char* s) { int a; do { fflush(stdin); printf("\n\n%s",s); 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 0 USM, Algorytmy i struktury danych, Wykład 7