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

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

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

Wykład 7 Abstrakcyjne typy danych kolejka priorytetowa

1. Abstrakcyjne typy danych

Wykład 9 - struktury rekurencyjne uporządkowane

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

Ć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

E S - uniwersum struktury stosu

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

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

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

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

Programowanie Proceduralne

int tab_a [ 2 ] [ 3 ];

Wstęp do programowania 1

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

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

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

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

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

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

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

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

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

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

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

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

Wstęp do programowania

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

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

Algorytmy i Struktury Danych.

Szablony klas, zastosowanie szablonów w programach

Programowanie Proceduralne

Wstęp do programowania 1

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

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

tablica: dane_liczbowe

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

Lista dwukierunkowa - przykład implementacji destruktorów

Dynamiczne struktury danych

Kontrola przebiegu programu

Struktury. Przykład W8_1

Funkcja (podprogram) void

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

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

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

Algorytmy i Struktury Danych.

Projektowanie klas c.d. Projektowanie klas przykład

Podstawy Programowania. Listy i stosy

Programowanie i struktury danych

Wstęp do programowania

Wykład 10 Grafy, algorytmy grafowe

Struktury czyli rekordy w C/C++

2 Przygotował: mgr inż. Maciej Lasota

Języki programowania - podstawy

Struktury dynamiczne

Zmienne i struktury dynamiczne

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

12. Rekurencja. UWAGA Trzeba bardzo dokładnie ustalić <warunek>, żeby mieć pewność, że ciąg wywołań się zakończy.

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

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

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

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Pobieranie argumentów wiersza polecenia

Programowanie w języku C++

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

۰ Elementem jednostkowym takiego pliku jest bajt. ۰ Format pliku binarnego: [bajty pliku][eof]

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

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

PROGRAMOWANIE OBIEKTOWE W C++ - cz 1. Definicja klasy, składniki klasy, prawa dost pu, definiowanie funkcji składowych, konstruktory i destruktory.

TEMAT : KLASY POLIMORFIZM

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

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

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

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

Instrukcje sterujące. Programowanie Proceduralne 1

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

INSTRUKCJE REPETYCYJNE PĘTLE

Programowanie strukturalne i obiektowe

Wskaźniki. Programowanie Proceduralne 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.

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

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

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

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

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

Strategia "dziel i zwyciężaj"

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Wykład 1

Grzegorz Cygan. Wstęp do programowania mikrosterowników w języku C

1. Utwórz blok pamięci współdzielonej korzystając z poniższego kodu:

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

INSTRUKCJE REPETYCYJNE PĘTLE

Listy powiązane zorientowane obiektowo

PROGRAMOWANIE w C prolog

Plik klasy. h deklaracje klas

Przychodnia 0. Stwórz projekt aplikacja konsolowa lub WPF (przemyśl wybór, bo zmiana może być czasochłonna). 1. Stwórz abstrakcyjną klasę Osoba.

Programowanie Procedurale

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

Transkrypt:

Wykład 6_2 Abstrakcyjne typy danych kolejki. Implementacja za pomocą tablicy i rekurencyjnej struktury danych czyli listy wiązanej Etap 1 - Opis ADT Nazwa typu: Kolejka elementów Własności typu: Potrafi przechować ciąg elementów o dowolnym rozmiarze Dostępne działania: Inicjalizacja kolejki Określenie, czy kolejka jest pusta Dodanie elementu do kolejki, Usuwanie z kolejki, typedef int dane; //typ informacji umieszczanej w kolejce typedef struct ELEMENT* stos; struct ELEMENT { dane Dane; stos Nastepny; ; struct kolejka { stos Poczatek, Koniec; ; //typ wskazania na element kolejki //typ elementu kolejki //typ przechowujący dane kolejki Etap 2 - Budowa interfejsu void Inicjalizacja(kolejka& Kolejka); { działanie: inicjuje kolejkę warunki wstępne: Kolejka.Poczatek i Kolejka.Koniec wskazują na pustą kolejkę warunki końcowe: kolejka zostaje zainicjowana jako pusta inline int Pusty(kolejka& Kolejka); {działanie: określa, czy kolejka jest pusta; typ inline, bo często wywoływana warunki wstępne: Kolejka jest zainicjowana, warunki końcowe: funkcja zwraca 1, jeśli kolejka jest pusta, jeśli nie- 0 int Wstaw(kolejka& Kolejka, dane Dana); { działanie: dodaje element na koniec ciągu, zwany końcem kolejki warunki początkowe: Dana jest daną do wstawienia na koniec zainicjowanej kolejki wskazanym przez Kolejka.Koniec warunki końcowe: jeśli jest to możliwe, funkcja dodaje daną Dana na koniec kolejki i zwraca 1, w przeciwnym wypadku 0 int Usun(kolejka& Kolejka); { działanie: usuwa element wstawiony do kolejki na początku ciągu, warunki początkowe: Kolejka.Poczatek jest niepustą kolejką warunki końcowe: usuwa element na poczatku kolejki i zwraca dane przez return. Kolejka.Koniec jest równy Kolejka.Poczatek, gdy kolejka jest pusta Autor: Zofia Kruczkiewicz, p.325 C3 USM, Algorytmy i struktury danych, Wykład6_2 1

Etap 3. Implementacja kolejki jako listy wiązanej wstawianie elementów zawsze na końcu struktury Kolejka.Koniec Kolejka. A B NULL Poczatek Nowy Kolejka. Poczatek Z A A NULL Nowy B Z NULL int Wstaw(kolejka& Kolejka, dane Dana) { stos Nowy; Nowy = new ELEMENT; if (Nowy!=NULL) Nowy->Dane=Dana; else return 0; if (Kolejka.Poczatek ==NULL) Kolejka.Poczatek=Nowy; else Kolejka.Koniec->Nastepny= Nowy; Kolejka.Koniec= Nowy; Kolejka.Koniec->Nastepny=NULL; return 1; usuwanie elementów zawsze na początku struktury. W przypadku, gdy po usunięciu kolejka staje się pusta Kolejka.Koniec jest równy Kolejka.Poczatek Pom Kolejka. A B Z NULL Poczatek Pom Kolejka. Poczatek Kolejka.Koniec B Z NULL dane Usun(kolejka& Kolejka) {stos Pom; dane d; Pom = Kolejka.Poczatek; Kolejka.Poczatek = Kolejka.Poczatek->Nastepny; d= Pom->Dane; //((*Pom).Dane) delete Pom; if (Kolejka.Poczatek==NULL) Kolejka.Koniec=NULL; return d; Autor: Zofia Kruczkiewicz, p.325 C3 USM, Algorytmy i struktury danych, Wykład6_2 2

#include <conio.h> #include <stdlib.h> #include <string.h> #include <stdio.h> //1. interfejs ADT kolejki typedef int dane; // dane umieszczone w kolejce typedef struct ELEMENT* stos; //nazwa wskaznika na element stosu struct ELEMENT { dane Dane; stos Nastepny; ; struct kolejka { stos Poczatek, Koniec; ; //funkcje ADT kolejki void Inicjalizacja(kolejka& Kolejka); inline int Pusty(kolejka Kolejka); int Wstaw(kolejka& Kolejka, dane Dana); dane Usun(kolejka& Kolejka); //2. funkcje we/wy dla danych umieszczonych w kolejce void Pokaz_dane (dane Dana); dane Dane(); //3. funkcje ogólnego przeznaczenia void Komunikat(char*); char Menu(const int ile, char *Polecenia[]); //4. elementy programu const int Esc=27; const int POZ=4; char * Tab_menu[POZ] = { "1 : Wstawianie do kolejki- na koniec", "2 : Usuwanie z kolejki-na poczatku", "3 : Wydruk kolejki wraz z jej usuwaniem", " >Esc Koniec programu"; //funkcje klienta korzystajace z kolejki void Wstaw_do_kolejki(kolejka& Kolejka); void Wyswietl_usun_z_kolejki(kolejka& Kolejka); Autor: Zofia Kruczkiewicz, p.325 C3 USM, Algorytmy i struktury danych, Wykład6_2 3

void main(void) { kolejka Kolejka; char Wybor; clrscr(); Inicjalizacja(Kolejka); do { Wybor= Menu(POZ, Tab_menu); switch (Wybor) { case '1' : Wstaw_do_kolejki(Kolejka); case '2' : if (Pusty(Kolejka)) Komunikat("\nKolejka pusty\n"); else (Usun(Kolejka)); case '3' : if (Pusty(Kolejka)) Komunikat("\nKolejka jest pusta\n") ; else Wyswietl_usun_z_kolejki(Kolejka); while (Wybor!=Esc ); //**************funkcje klienta korzystające ze stosu*********** void Wstaw_do_kolejki(kolejka& Kolejka) { dane Dana; Dana= Dane(); if (Wstaw(Kolejka, Dana)==0) Komunikat("Brak pamieci\n"); void Wyswietl_usun_z_kolejki(kolejka& Kolejka) { dane d; while (!Pusty(Kolejka)) { d=usun(kolejka); Pokaz_dane(d); Autor: Zofia Kruczkiewicz, p.325 C3 USM, Algorytmy i struktury danych, Wykład6_2 4

//*********funkcje interfejsu ADT kolejki************ void Inicjalizacja(kolejka& Kolejka) { Kolejka.Poczatek=Kolejka.Koniec = NULL; inline int Pusty(kolejka Kolejka) { return Kolejka.Poczatek==NULL; int Wstaw(kolejka& Kolejka, dane Dana) { stos Nowy; Nowy = new ELEMENT; if (Nowy!=NULL) Nowy->Dane=Dana; else return 0; if (Kolejka.Poczatek ==NULL) else Kolejka.Koniec->Nastepny=NULL; return 1; dane Usun(kolejka& Kolejka) { stos Pom; dane d; Kolejka.Poczatek=Nowy; Kolejka.Koniec->Nastepny= Nowy; Kolejka.Koniec= Nowy; Pom = Kolejka.Poczatek; Kolejka.Poczatek = Kolejka.Poczatek->Nastepny; d= Pom->Dane; //((*Pom).Dane) delete Pom; if (Kolejka.Poczatek==NULL) Kolejka.Koniec=NULL; return d; Autor: Zofia Kruczkiewicz, p.325 C3 USM, Algorytmy i struktury danych, Wykład6_2 5

//*******funkcje we/wy dla danych umieszczonych w kolejce********* dane Dane() { int a; do { fflush(stdin); printf("\n\npodaj dane typu int: "); while (scanf("%d",&a)!=1); return a; void Pokaz_dane(dane Dana) { printf("\nnumer: %d\n", Dana); printf("nacisnij dowolny klawisz...\n"); getch(); //*********funkcje ogolnego 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(); Autor: Zofia Kruczkiewicz, p.325 C3 USM, Algorytmy i struktury danych, Wykład6_2 6

Etap 3. Implementacja stosu za pomocą tablicy zainicjowanie kolejki: N=8 Koniec=0, Poczatek=N dodanie: tab[koniec], Koniec=(Koniec+1) mod N usuwanie: Poczatek=Poczatek mod N, return tab[poczatek], Poczatek++ A) Kolejka pusta zainicjowana: N=8 Koniec=0, Poczatek=N Koniec=0, Poczatek=N B) Kolejka zawiera trzy elementy: Koniec=3, Poczatek=0 (dodano: 0(a, 1(b), 2(c))) Poczatek Koniec a b c C) Kolejka zawiera trzy elementy: Poczatek=3, Koniec=5 (usunięto: 0(a), 1(b), 2(c) i dodano: 3(d), 4(e))) Poczatek Koniec d e D) Kolejka zawiera pięć elementów: Koniec=2, Poczatek=5 (usunięto 3(d), 4(e)) i wstawiono: 5(a), 6(b), 7(c), 0(d), 1(e) ) Koniec Poczatek d e a b c E) Kolejka pełna: Koniec=5, Poczatek=5 (po wstawieniu na koniec następujących elementów: 2(f), 3(g), 4(h)) Poczatek Koniec d e f g h a b c F) Kolejka pusta, stan nieokreślony: Koniec=5, Poczatek=5 (po usunięciu elementów: 5(a), 6(b), 7(c), 0(d), 1(e), 2(f), 3(g), 4(h)). Należy więc po usunięciu ostatniego elementu zainicjować kolejkę tak, aby Poczatek =N, Koniec=0, czyli wprowadzić kolejkę w stan A) Poczatek Koniec Autor: Zofia Kruczkiewicz, p.325 C3 USM, Algorytmy i struktury danych, Wykład6_2 7

#include <conio.h> #include <stdlib.h> #include <string.h> #include <stdio.h> //1. interfejs ADT kolejki typedef int dane; // dane umieszczone stosie const long N=5; struct kolejka //elementy typu kolejki { int Poczatek; int Koniec; dane tab[n]; ; //funkcje interfejsu mają ten sam nagłówek jak dla listy wiązanej void Inicjalizacja(kolejka& Kolejka); inline int Pusty(kolejka Kolejka); int Wstaw(kolejka& Kolejka, dane Dana); dane Usun(kolejka& Kolejka); //Funkcje we/wy, ogólnego przeznaczenia, klienckie oraz program są //identyczne dla obu implementacji //2. funkcje we/wy dla danych umieszczonych w kolejce void Pokaz_dane (dane Dana); dane Dane(); //3. funkcje ogolnego przeznaczenia void Komunikat(char*); char Menu(const int ile, char *Polecenia[]); //4. elementy programu const int Esc=27; const int POZ=4; char * Tab_menu[POZ] = { "1 : Wstawianie do kolejki- na koniec", "2 : Usuwanie z kolejki-na poczatku", "3 : Wydruk kolejki wraz z jej usuwaniem", " >Esc Koniec programu"; //funkcje klienta korzystajace z kolejki void Wstaw_do_kolejki(kolejka& Kolejka); void Wyswietl_usun_z_kolejki(kolejka& Kolejka); Autor: Zofia Kruczkiewicz, p.325 C3 USM, Algorytmy i struktury danych, Wykład6_2 8

void main(void) { kolejka Kolejka; char Wybor; clrscr(); Inicjalizacja( Kolejka); do { Wybor= Menu(POZ, Tab_menu); switch (Wybor) { case '1' : Wstaw_do_kolejki(Kolejka); case '2' : if (Pusty(Kolejka)) Komunikat("\nStos pusty\n"); else (Usun(Kolejka)); case '3' : if (Pusty(Kolejka)) Komunikat("\nStos pusty\n") ; else Wyswietl_usun_z_kolejki(Kolejka); while (Wybor!=Esc ); //*********funkcje interfejsu ADT kolejki************ void Inicjalizacja(kolejka& Kolejka) { Kolejka.Poczatek = N; Kolejka.Koniec=0; inline int Pusty(kolejka Kolejka) { return Kolejka.Poczatek==N && Kolejka.Koniec==0; int Wstaw(kolejka& Kolejka, dane Dana) { if (Kolejka.Poczatek!= Kolejka.Koniec) { Kolejka.tab[Kolejka.Koniec++] = Dana; Kolejka.Koniec %= N; if (Kolejka.Poczatek==N) Kolejka.Poczatek=0; return 1; else return 0; dane Usun(kolejka& Kolejka) { dane d; Kolejka.Poczatek %= N; d= Kolejka.tab[Kolejka.Poczatek++]; if (Kolejka.Poczatek%N==Kolejka.Koniec) Inicjalizacja(Kolejka); return d; Autor: Zofia Kruczkiewicz, p.325 C3 USM, Algorytmy i struktury danych, Wykład6_2 9