From Tomasz Żok

WprowadzenieDoInformatyki: StrukturyDanychWskaźniki

BST (Binary Search Tree)

Operacja dodawania elementów (tworzenie drzewa)

  1. i = pobierz element z listy
  2. node = korzeń drzewa
  3. Jeśli node nie istnieje, podstaw i pod ten węzeł i wróć do punktu 1
  4. W przeciwnym razie:
    1. Jeśli i <= node, niech node = lewy potomek,
    2. Jeśli i > node, niech node = prawy potomek
  5. Wróć do punktu 3

Operacja wyszukiwania elementu

  1. i = szukana liczba
  2. node = korzeń drzewa
  3. Jeśli node nie istnieje, odpowiedź brzmi NIE
  4. W przeciwnym razie:
    1. Jeśli node == i, odpowiedź brzmi TAK
    2. Jeśli i < node, niech node = lewy potomek
    3. Jeśli i > node, niech node = prawy potomek
  5. Wróć do punktu 3

Operacja usuwania elementu

  1. i = szukana liczba
  2. node = korzeń drzewa
  3. Jeśli node nie istnieje, zakończ działanie
  4. W przeciwnym razie:
    1. Jeśli node == i, usuń węzeł i zakończ działanie
    2. Jeśli i < node, niech node = lewy potomek
    3. Jeśli i > node, niech node = prawy potomek
  5. Wróć do punktu 3
  • Jeśli węzeł ma jednego potomka, należy nim zastąpić miejsce usuniętego elementu. Przykład dla liczby 50:
  • Jeśli węzeł ma dwóch potomków, należy zastąpić go największym elementem lewego poddrzewa lub najmniejszym elementem prawego poddrzewa. Przykład dla liczby 150 (zarówno drugie i trzecie drzewo BST są prawidłowo zreorganizowane)

Kopiec / stóg (ang. heap)

  • Jest 10 elementów, pierwszy wolny indeks to 11 (użyteczne przy tworzeniu kopca, patrz też niżej):
  • Jest 6 elementów, ostatni zajęty indeks to 6 (użyteczne przy usuwaniu korzenia, patrz też niżej):

Operacja dodawania elementów (tworzenie kopca)

  1. i = pobierz element z listy
  2. Wstaw i do drzewa (by zachować warunek pełności)
  3. Jeśli i > rodzic(i), zamień je miejscami i wykonaj ten sam punkt ponownie
  4. W przeciwnym razie, wróć do punktu 1

Operacja usuwania korzenia

  1. Wstaw w miejsce korzenia ostatni element kopca i niech node = korzeń
  2. Jeśli node jest większy od obu potomków, zakończ działanie
  3. W przeciwnym razie, zamień miejscami node z potomkiem o większej wartości. Dla nowej pozycji node powróć do poprzedniego punktu

Wskaźniki

Napisy w C

Kod zadania z laboratoriów

#include <stdio.h>

/******************************************************************************
 * Wyznacz dlugosc napisu `s`.
 *
 * Przyklad:
 *   wejscie:       s = "TEST"
 *   wyjscie:       4
 *****************************************************************************/

int strlen(char* s) {
    int n = 0;

    // petla ma sie wykonywac dopoki nie napotkamy zera (konca napisu)
    while (*s != 0) {
        n++;    // zwieksz licznik dlugosci napisu
        s++;    // przesun sie do nastepnego znaku w napisie
    }
    return n;
}

/******************************************************************************
 * Sprawdz czy w napisie `s` znajduje sie litera `c`.
 *
 * Przyklad:
 *   wejscie:       s = "TEST", c = 'P'
 *   wyjscie:       0
 *
 *   wejscie:       s = "TEST", c = 'E'
 *   wyjscie:       1
 *****************************************************************************/

int contains(char* s, char c) {
    // wykonuj dopoki nie napotkasz zera (konca napisu)
    while (*s != 0) {
        // jesli znajdziesz szukany znak `c`, zakoncz z wynikiem 1
        if (*s == c) {
            return 1;
        }
        // w przeciwnym razie, przesun sie do kolejnego znaku w napisie
        s++;
    }
    return 0;
}

/******************************************************************************
 * Wypisz napis `s` w odwrotnej kolejnosci.
 *
 * Przyklad:
 *   wejscie:       s = "ABCD"
 *   na ekranie:    DCBA
 *****************************************************************************/

void print_rev(char *s) {
    char *ps = s;

    // przesun sie na koniec napisu
    while (*ps != 0) {
        ps++;
    }

    do {
        ps--;               // wycofaj sie o jedna pozycje w napisie
        printf("%c", *ps);  // wypisz znak
    } while (ps != s);      // zakoncz petle jesli wrociles do poczatku napisu
}


int main() {
    char s[10];
    scanf("%s", s);

    int n = strlen(s);    
    printf("Dlugosc napisu: %d\n", n);

    char c = 's';
    int flag = contains(s, c);
    printf("Czy napis zawiera litere %c: %s\n", c, flag ? "TAK" : "NIE");

    printf("Napis odwrocony: ");
    print_rev(s);
    printf("\n");

    return 0;
}
Retrieved from http://www.cs.put.poznan.pl/tzok/wiki/index.php?n=WprowadzenieDoInformatyki.StrukturyDanychWska%c5%baniki
Page last modified on 2013 Dec Sat 7 14:06