algorytm.org

Implementacja w C/C++



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Kopiec (Stóg) - Implementacja w C/C++
Ocena użytkownikóww: *****  / 14
SłabyŚwietny
Nadesłany przez Emil Hotkowski, 11 lutego 2012 20:26
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

kopiec.cpp:
//Kopiec
//Emil Hotkowski
//www.algorytm.org

#include <cstdlib>
#include <iostream>
#define N 5000 //maksymalna liczba elementow w kopcu
using namespace std;

//Deklaracja klasy kopca
class kopiec{
    public:
        int tab[N];
        int size;
        kopiec();
        void insert_into(int v);
        void delete_root();
        void wyswietl(int poczatek);
        void sort();
};

//Przyklad uzycia
int main(int argc, char *argv[])
{
    //utworz kopiec
    kopiec K;
    
    //wstaw elementy do kopca
    K.insert_into(2);
    K.insert_into(5);
    K.insert_into(3);
    K.insert_into(1);
    K.insert_into(7);
    
    //wsywietl elementy kopca poczawszy od pierwszego
    K.wyswietl(1);
    system("PAUSE");

    //usun korzen i wsywietl elementy kopca poczawszy od pierwszego
    K.delete_root();
    K.wyswietl(1);
    system("PAUSE");

    //posortuj kopiec
    K.sort();
    
    system("PAUSE");
    return EXIT_SUCCESS;
}


//************
//METODY
//************

//Konstruktor - tworzy pusty kopiec
kopiec::kopiec(){
    size = 0;
}

//Wstawia element o wartosci v do kopca
void kopiec::insert_into(int v){
    tab[size+1] = v;
    int s = size+1;
    while(s!=1) {
        if(tab[s/2] < tab[s]) {
            swap(tab[s/2],tab[s]);s/=2;
        }
        else 
            break;
    }
    size++;
}

//Usuwa korzen kopca
void kopiec::delete_root() {
    tab[1] = tab[size];
    size--;
    int tmp = 1;
    while(tmp*2 <= size){
        if(tab[tmp] < tab[tmp*2] || tab[tmp] < tab[tmp*2+1]) {
            if(tab[tmp*2] > tab[tmp*2+1] || tmp*2+1 > size) {
                swap(tab[tmp],tab[tmp*2]);tmp=tmp*2;}
            else {
                swap(tab[tmp],tab[tmp*2+1]);tmp=tmp*2+1;
            } 
        }
        else 
            break;
    }
}

//Sortuje kopiec
void kopiec::sort() {
     for(int i = 0 ; i <= size; i++) {
        cout << tab[1] << " ";
        delete_root();
    }
    cout << tab[1] << "\n";
}

//Wyswietla zawartosc kopca poczawszy od elementu poczatek
void kopiec::wyswietl(int poczatek){
    if(poczatek <= size) {
        cout << poczatek << " : " <<  tab[poczatek] << " \n";
        if(poczatek*2 <= size) wyswietl(poczatek*2);
        if(poczatek*2+1 <= size) wyswietl(poczatek*2+1);
    }
}
Dodaj komentarz