Lista dwukierunkowa. Grzegorz Wasylów Konrad Wojtoń

Podobne dokumenty
Algorytmy i Struktury Danych.

Język programowania PASCAL

INSTRUKCJA PUSTA. Nie składa się z żadnych znaków i symboli, niczego nie robi. for i := 1 to 10 do {tu nic nie ma};

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

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Dynamiczne struktury danych

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja, - liczby losowe

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

Podstawy programowania 2. Temat: Wprowadzenie do wskaźników. Przygotował: mgr inż. Tomasz Michno

Instrukcje podsumowanie. Proste: - przypisania - wejścia-wyjścia (read, readln, write, writeln) - pusta - po prostu ; (średnik) Strukturalne:

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

Algorytmy i Struktury Danych.

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

Procedury i funkcje. Przykład programu z procedurą. Definicja. Cechy procedury

Pascal. 1. Pliki tekstowe. Przykład 1.1. Zapis do pliku tekstowego

Struktury. Przykład W8_1

Dynamiczne struktury danych

Algorytmy i struktury danych. wykład 5

INSTRUKCJA ITERACYJNA REPEAT. repeat Instrukcja_1; Instrukcja_2; {... } Instrukcja_N; until wyr ; INSTRUKCJA ITERACYJNA WHILE

Programowanie obiektowe

PODSTAWY INFORMATYKI wykład 6.

Wstęp do programowania. Różne różności

Lista 5 Typy dynamiczne kolejka

Informatyka 1. Przetwarzanie tekstów

Struktury danych: stos, kolejka, lista, drzewo

2.Sprawdzanie czy podana liczba naturalna jest pierwsza Liczba pierwsza to liczba podzielna tylko przez 1 i przez siebie.

Programowanie w Turbo Pascal

APROKSYMACJA. Rys. 1. Funkcja aproksymująca zbiór punktów pomiarowych (1) (2) (3) (4) (5) (6) (7) ... Zmienna y

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

Zmienne i struktury dynamiczne

ZASADY PROGRAMOWANIA KOMPUTERÓW

Lab 9 Podstawy Programowania

Podstawy programowania. Wykład PASCAL. Zmienne wskaźnikowe i dynamiczne. dr Artur Bartoszewski - Podstawy prograowania, sem.

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

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja cz. 1

Listy, kolejki, stosy

typ zakres sposob zapamietania shortint integer bajty (z bitem znaku) longint byte word

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

Przykładowerozwiązania.

Lekcja 6: Pascal. Procedura i funkcja

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

1. Język Pascal Program

PLIKI TEKSTOWE F C E 30 0D 0A 42 6F 72 6C 61 6E 64 1A T U R B O _ P A S C A L _ 7. 0

Pliki. Operacje na plikach w Pascalu

Porządek symetryczny: right(x)

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

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

Wstęp do programowania

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

Język ludzki kod maszynowy

Materiały do laboratorium MS ACCESS BASIC

Podstawy Programowania. Listy i stosy

OPERACJE NA PLIKACH. Podstawowe pojęcia:


Wstęp do programowania. Listy. Piotr Chrząstowski-Wachtel

ang. file) Pojęcie pliku (ang( Typy plików Atrybuty pliku Fragmentacja wewnętrzna w systemie plików Struktura pliku

Matematyka dyskretna - wykład - część Podstawowe algorytmy kombinatoryczne

Drzewa podstawowe poj

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Zakres wykładu INFORMATYKA. dr inż. Michał Łanczont Wydział Elektrotechniki i Informatyki p. E419 tel

Podstawowe struktury danych

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

Podprogramy. Procedury

Optymalizacja. Przeszukiwanie lokalne

Algorytmy i struktury danych

Grafem nazywamy strukturę G = (V, E): V zbiór węzłów lub wierzchołków, Grafy dzielimy na grafy skierowane i nieskierowane:

Wstęp do programowania. Zastosowania stosów i kolejek. Piotr Chrząstowski-Wachtel

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

Sortowanie topologiczne skierowanych grafów acyklicznych

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

Przykładowe B+ drzewo

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

Zasady Programowania Strukturalnego

Wymiar musi być wyrażeniem stałym typu całkowitego, tzn. takim, które może obliczyć kompilator. Przykłady:

Algorytm. a programowanie -

Struktury danych (I): kolejka, stos itp.

20. Pascal i łączenie podprogramów Pascala z programem napisanym w C

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Kontenery i iteratory. Wykorzystanie kontenerów w praktyce.

Wstęp do programowania

Ada-95. Dariusz Wawrzyniak

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

Jak Windows zarządza pamięcią?

Tabela wewnętrzna - definicja

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel

Lista, Stos, Kolejka, Tablica Asocjacyjna

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

Stałe i zmienne znakowe. Stała znakowa: znak

Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

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

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

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

WSTĘP DO INFORMATYKI. Struktury liniowe

Programowanie i struktury danych

TEMAT: Podejmowanie decyzji w programie instrukcja warunkowa (IF).

INSTRUKCJE PĘTLI, INSTRUKCJA WYBORU. Instrukcja pętli For to do

Transkrypt:

Grzegorz Wasylów Konrad Wojtoń Lista dwukierunkowa Lista dwukierunkowa to nic innego jak modyfikacja listy jednokierunkowej. Zaletą takiej listy jest możliwość przejścia nie tylko do następnego elementu, ale i także do poprzedniego elementu w zbiorze danych tzw. liście. Definicja listy: listą będziemy nazywali zestaw liniowo powiązanych ze sobą pól dowolnego typu. Lub też prościej: lista jest w pewnym sensie odpowiednikiem wektora. Cechy wspólne z nim to: liniowe uporządkowanie - zarówno w liście, jak i w wektorze każdy element z wyjątkiem pierwszego i ostatniego ma poprzednika i następnika, obie struktury są jednowymiarowe i o uporządkowanej kolejności. Różnice: z punktu widzenia użytkownika wektor jest strukturą danych o swobodnym dostępie (możemy odwołać się bezpośrednio do dowolnego elementu poprzez jego numer), natomiast dostęp do danych pamiętanych na liście jest sekwencyjny (można odwołać się jedynie do elementów sąsiadujących z aktualnym). Z punktu widzenia systemu operacyjnego, wektor jest ciągłym obszarem pamięci, natomiast lista jest zestawem powiązanych ze sobą, nieciągłych fragmentów umieszczonych w różnych obszarach RAM. Operujemy tutaj głównie na wskaźnikach, dzięki którym znamy poszczególne adresy w pamięci następnego i poprzedniego elementu listy. Język Pascal udostępnia nam możliwość sprawdzenia offsetu pamięci: writeln(ofs(wskaznik^.dane)); Dzięki temu możemy zauważyć, że rezerwowana jest zawsze dokładnie taki sam przedział pamięci na każdy element, w związku z czym łatwo jest obliczyć rozmiar pamięci, czy też położenie danego elementu w liście. Za pomocą procedur new() oraz dispose() dowolnie sterujemy pamięcią komputera poprzez tworzenie miejsca w pamięci i jego zwalnianie. Jest to bardzo istotne podczas dynamicznego tworzenia elementów listy w pamięci. Schemat listy dwukierunkowej: x = nil = wskaźnik

Do listy możemy dodawać nowe elementy, usuwać oraz przeszukiwać ją. Poniżej przedstawione są schematy takich działań: Dodawanie nowego elementu: Usuwanie elementu: Przeszukiwanie listy polega na tym aby sprawdzić w warunku pętli każdy z elementów listy, tj. porównać go wraz z wzorcem szukanym. Należy zmieniać indeks elementu, tzn. musimy wskazywać na wskaźnik do następnego elementu listy, aby zachować jej ciągłość i poprawne działanie. Źródło programu: http://ux.ap.krakow.pl/~blur/alg_and_structs/pro/ Listing programu: {--------------------------------------------------------------------------------} program dwukierunkowa; uses crt; const N = 15; type wsklista = ^element; element = record dane : integer; wskpoprzednika : wsklista; wsknastepnika : wsklista;

type nodelist = ^e; e = record first : wsklista; last: wsklista; aktualny: wsklista; lista: nodelist; wartosc : integer; co: char; procedure showactual( lista: nodelist); writeln(lista^.aktualny^.dane); procedure createlist( lista : nodelist); lista^.first := nil; lista^.last := nil; lista^.aktualny := nil; procedure deletelist( lista : nodelist); tmp: wsklista; lista^.aktualny := lista^.first; while lista^.aktualny <> nil do tmp := lista^.aktualny^.wsknastepnika; lista^.aktualny := tmp; procedure search( lista : nodelist; szukana : integer); lista^.aktualny := lista^.first; while lista^.aktualny <> nil do if(lista^.aktualny^.dane = szukana) then writeln('szukana liczba: ',szukana,' znaleziona w liscie'); break; lista^.aktualny := lista^.aktualny^.wsknastepnika; if(lista^.aktualny) = nil then writeln('nie znaleziono ', szukana);

procedure readlist( lista : wsklista); tmp : wsklista; writeln('zawartosc Listy'); tmp := lista; while tmp <> nil do write(' => ',tmp^.dane); tmp := tmp^.wsknastepnika; writeln; procedure pushfront( lista : nodelist; nowy: wsklista); lista^.first := nowy; nowy^.wsknastepnika := lista^.aktualny; lista^.aktualny^.wskpoprzednika := nowy; nowy^.wskpoprzednika := nil; lista^.aktualny := nowy; procedure pushinside( lista : nodelist; nowy: wsklista); lista^.aktualny^.wskpoprzednika^.wsknastepnika := nowy; nowy^.wsknastepnika := lista^.aktualny; nowy^.wskpoprzednika := lista^.aktualny^.wskpoprzednika; lista^.aktualny^.wskpoprzednika := nowy; procedure pushend( lista: nodelist; nowy: wsklista); if lista^.first = nil then lista^.first := nowy lista^.last^.wsknastepnika := nowy; nowy^.wskpoprzednika := lista^.last; lista^.last := nowy; procedure push( lista: nodelist; wart: integer); nowy: wsklista; new(nowy); nowy^.dane := wart; if lista^.aktualny <> nil then if lista^.aktualny = lista^.first then pushfront(lista, nowy) pushinside(lista, nowy) pushend(lista, nowy) procedure popfront( lista: nodelist);

lista^.first := lista^.first^.wsknastepnika; write('usunieto aktualny czyli '); showactual(lista); lista^.aktualny := lista^.first; if lista^.first <> nil then lista^.first^.wskpoprzednika := nil lista^.last := nil procedure popinside( lista: nodelist); tmp: wsklista; tmp := lista^.aktualny^.wskpoprzednika; tmp^.wsknastepnika := lista^.aktualny^.wsknastepnika; lista^.aktualny^.wsknastepnika^.wskpoprzednika := tmp; write('usunieto aktualny czyli '); showactual(lista); lista^.aktualny := tmp; procedure popend( lista: nodelist); tmp: wsklista; tmp := lista^.aktualny^.wskpoprzednika; tmp^.wsknastepnika := nil; lista^.last := tmp; write('usunieto aktualny czyli '); showactual(lista); lista^.aktualny := nil; procedure pop( lista : nodelist); {if lista^.aktualny = nil then} if lista^.aktualny = lista^.first then popfront(lista) if lista^.aktualny = lista^.last then popend(lista) popinside(lista) { main } new(lista); createlist(lista); repeat clrscr; writeln('d - dodaj do listy'); writeln('s - szukaj w liscie'); writeln('z - usun z listy aktualny');

writeln('w - wypisz liste'); writeln('q - koniec'); co:=readkey; case co of 'd': write('podaj warosc: '); read(wartosc); push(lista, wartosc); 's': writeln('wartosc szukana'); read(wartosc); search(lista, wartosc); co:=readkey; 'z': pop(lista); 'w': readlist(lista^.first); co:=readkey; until co='q'; deletelist(lista);. {--------------------------------------------------------------------------------}