Zadanie A "przy tablicy"


Zaimplementuj operacje na liście dwukierunkowej, oznaczone (!!!) w poniższym zadaniu.
 

Zadanie 25


Zaimplementuj listę dwukierunkową ...
 
oraz następujące operacje:
    struct ElementListy { 
      ElementListy *nastepny, *poprzedni;
      int liczba; // "zawartość" elementu listy
    }; 
      // struktura reprezentujące element listy;
      // kazdy element listy zawiera "liczbę"

    struct Lista {
      ElementListy *glowa, *ogon;
    };
      // struktura reprezentujące listę

    void NowaLista(Lista &l);
      // tworzy pustą listę

    void DodajElement(Lista &l, int liczba, int gdzie);
      // gdzie = GŁOWA lub OGON
      // (!!!)

    void UsunElement(Lista &l, int gdzie);
      // usuwanie elementu z jednego z końców listy
      // (!!!)

    int ListaJestPusta(Lista &l);
      // zwraca 1 jeśli lista jest pusta, w przeciwnym wypadku zwraca 0

    void PokazListe(Lista &l, int gdzie);
      // parametr "gdzie" decyduje od którego końca pokazujemy listę

    void UsunCalaListe(Lista &l);
  • Sprawdź działanie na małym przykładzie.
  • Jaki jest czas działania powyższych operacji ?

  •  
     
     

    Kopce; algorytm HeapSort

    Kopiec jest drzewem binarnym, z pewną dodatkową własnością kopca, przechowywanym w zwykłej tablicy liczb całkowitych A.

    To drzewo binarne jest "prawie" pełne - ostatni poziom drzewa nie musi być pełny.

    Tablica A powinna posiadać atrybuty:

    Elementy tablicy A indeksujemy od 1.
    Jeśli "i" jest indeksem pewnego elementu drzewa to dostęp do ojca oraz do lewego i prawego potomka tego elementu uzyskujemy przy pomocy funkcji;
        int Parent(int i) { /* należy je samodzielnie zaprogramować ! */ }
        int Left(int i)   { /* ... */ }
        int Right(int i)  { /* ... */ }
    Własność kopca: 

             dla każdego wierzchołka o indeksie "i", który nie jest korzeniem: 
                       A[Parent(i)] >= A[i]; 
     

    .
    Przykład kopca:
    następującej tablicy: odpowiada drzewo:

     

    Poniżej opisuję pewne procedury wykonujące operacje na kopcu ...

    Uwaga: Mówiąc że "i jest kopcem" rozumiem, że drzewo binarne którego korzeniem jest "i-ty element tablicy A" jest kopcem (czyli posiada własność kopca).

    Procedura Heapify(A,i)

    Procedura BuildHeap(A) Procedura HeapSort(A) Zadanie 26

    Zaprogramuj i sprawdź działanie procedury HeapSort.
    Do przechowywania kopca użyj struktury:
        struct Heap {
          int length; // długość tablicy
          int heapSize;
          int *A; // indeksujemy od 1 !!!
        };
    Należy zaimplementować następujące procedury: Sprawdź HeapSort na małym ciągu liczb.

     
     

    Kolejki priorytetowe (przy pomocy kopców)

    Kolejka priorytetowa to zbiór "S" elementów "x", z których każdy posiada klucz "key[x]" (jest to liczba całkowita), pozwalający na wykonywanie następujących operacji:

    Procedura Insert(S,x)

    Procedura Maximum(S) Procedura ExtractMax(S)  
    Zadanie 27

    Zaimplementuj kolejkę priorytetową przy pomocy kopca.
    Do reprezentowania kolejki użyj struktur:
        struct Elem {
          int key; // klucz elementu
          int value; // wartość elementu
        };    
        struct HeapPri {
          int length;
          int heapSize;
          Elem *A; // indeksujemy od 1 !!!
        };
    Należy zaimplementować następujące procedury: Implementacja oczywista (zwraca "value" elementu z maksymalnym "key") Wskazówka: do A[1] przepisz ostatni element kopca; potem dokonaj odpowiednich uaktualnień. Wskazówka: dodajemy nowy liść "x" do drzewa (na koniec); oczywiście ojciec "x"-a może nie spełniać własności kopca.  Istnieje ścieżka od "x"-a do korzenia drzewa.  Przesuwamy "x" po tej ścieżce, w kierunku korzenia, aż nie znajdziemy dla niego właściwego miejsca (przesuwanie polega na "zamianie miejscami" z ojcem).  Zauważmy, że mimo przesuwania "x"-a, drzewo o korzeniu w "x" jest zawsze kopcem - nie jest to takie całkiem oczywiste !.
     
     

    Zadanie 28


    Do kolejki priorytetowej dodaj operacje: Zmieniającą klucz elementu tablicy o indeksie "i" i zachowującą własność kopca.