Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Kopcowanie.

Ostatnio zmodyfikowano 2014-06-08 04:06
Autor Wiadomość
pepe450
Temat założony przez niniejszego użytkownika
Kopcowanie.
» 2014-06-06 15:43:38
Witam mam za zadanie napisać program, buduje kopiec o ilości elementów podanych przez użytkownika. A następnie usuwa z korzenia element też określoną przez użytkownika ilość razy.
Budowanie kopca napisałem ale nie mam pomysłu jak się zabrać za usuwanie.

Proszę o jakieś wskazówki.
C/C++
#include<iostream>
#include<iomanip>
using namespace std;
void kop( int dane[], int rozmiar );
void pokaz( int dane[], int rozmiar );
int budowanie( int dane[], int element );
void usuwanie( int dane[], int ile, int rozmiar );
int main()
{
    const int rozmiar = 1000;
    int dane[ rozmiar ];
    kop( dane, rozmiar );
}
void kop( int dane[], int rozmiar )
{
    int element;
    int ile;
    int wielkosctablicy;
    cout << endl;
    cout << "Ile elementow chcesz dodac do kopca?" << endl;
    cin >> ile;
    for( int i = 1; i <= ile; i++ )
    {
        cout << endl;
        cout << "Podaj element numer: " << i;
        cout << endl;
        cin >> element;
        wielkosctablicy = budowanie( dane, element );
        pokaz( dane, i );
    }
    cout << "Ile elementow chcesz usunac?" << endl;
    int ile2;
    cin >> ile2;
    usuwanie( dane, ile2, wielkosctablicy );
}
void pokaz( int dane[], int rozmiar )
{
    int i = 1;
    int n = 6;
    while( i <= rozmiar )
    {
        cout << i << " " << setw( n ) << dane[ i ] << endl;
        i++;
    }
}
int budowanie( int dane[], int element )
{
    static int licznik = 0;
    licznik++;
    int k;
    int l;
    l = licznik;
    k = licznik / 2;
    dane[ l ] = element;
    /* cout<<"L "<<l<<endl;
        cout<<"K "<<k<<endl;*/
    while(( k > 0 ) &&( dane[ k ] > element ) )
    {
        swap( dane[ k ], dane[ l ] );
        l = k;
        if( k > 1 ) k = k / 2;
       
        element = dane[ l ];
        /* cout<<"Element "<<element<<endl;
                cout<<"Dane[k] "<<dane[k]<<endl;*/
    }
    return licznik;
}
void usuwanie( int dane[], int ile, int rozmiar )
{
   
}
P-111557
pekfos
» 2014-06-06 20:33:39
http://www.algorytm.org​/klasyczne/kopiec-stog.html - "Usuwanie największego elementu"
P-111595
pepe450
Temat założony przez niniejszego użytkownika
» 2014-06-07 01:04:29
C/C++
#include<iostream>
#include<iomanip>
using namespace std;
void kop( int dane[], int rozmiar );
void pokaz( int dane[], int rozmiar );
int budowanie( int dane[], int element );
void usuwanie( int dane[], int ile, int rozmiar );
int main()
{
    const int rozmiar = 1000;
    int dane[ rozmiar ];
    kop( dane, rozmiar );
}
void kop( int dane[], int rozmiar )
{
    int element;
    int ile;
    int wielkosctablicy;
    cout << endl;
    cout << "Ile elementow chcesz dodac do kopca?" << endl;
    cin >> ile;
    for( int i = 1; i <= ile; i++ )
    {
        cout << endl;
        cout << "Podaj element numer: " << i;
        cout << endl;
        cin >> element;
        wielkosctablicy = budowanie( dane, element );
        pokaz( dane, i );
    }
    cout << "Ile elementow chcesz usunac?" << endl;
    int ile2;
    cin >> ile2;
    usuwanie( dane, ile2, wielkosctablicy );
}
void pokaz( int dane[], int rozmiar )
{
    int i = 1;
    int n = 6;
    while( i <= rozmiar )
    {
        cout << i << " " << setw( n ) << dane[ i ] << endl;
        i++;
    }
}
int budowanie( int dane[], int element )
{
    static int licznik = 0;
    licznik++;
    int k;
    int l;
    l = licznik;
    k = licznik / 2;
    dane[ l ] = element;
    /* cout<<"L "<<l<<endl;
        cout<<"K "<<k<<endl;*/
    while(( k > 0 ) &&( dane[ k ] > element ) )
    {
        swap( dane[ k ], dane[ l ] );
        l = k;
        if( k > 1 ) k = k / 2;
       
        element = dane[ l ];
        /* cout<<"Element "<<element<<endl;
                cout<<"Dane[k] "<<dane[k]<<endl;*/
    }
    return licznik;
}
void usuwanie( int dane[], int ile, int rozmiar )
{
    int k = 1;
    int l = 2;
    int x = 2;
    dane[ k ] = dane[ rozmiar ];
    rozmiar--;
    while( l < rozmiar ) //jak sprawdzać czy doszedłem do poziomu liści
    {
        if( dane[ l ] <= dane[ l + 1 ] )
        {
            cout << "A" << endl;
            cout << "K" << k << endl;
            cout << "L" << l << endl;
            swap( dane[ k ], dane[ l ] );
        }
        else
        {
            cout << "B" << endl;
            cout << "K" << k << endl;
            cout << "L" << l << endl;
            swap( dane[ k ], dane[ l + 1 ] );
        }
        k = l;
        l = x * 2;
        x = x * 2;
    }
    pokaz( dane, rozmiar );
}

Napisałem funkcję usuwającą tylko nie wiem jak sprawdzać czy doszedłem do poziomu liści.
Jakaś porada by się przydała. :)
P-111621
pekfos
» 2014-06-07 19:20:13
P-111655
pepe450
Temat założony przez niniejszego użytkownika
» 2014-06-07 23:00:11
Czytałem stronkę
ale nie wiem jak się zabezpieczyć w sytuacji gdy dochodzę do przed ostatniej gałęzi.
w wtedy mam sprawdzić potomków a prawego potomka nie ma
P-111713
pekfos
» 2014-06-07 23:51:00
Jak masz n elementów w kopcu, numerowanych 1..n, to jak nie ma prawego potomka, to jego numer jest większy od n. W czym problem..?
P-111719
pepe450
Temat założony przez niniejszego użytkownika
» 2014-06-08 04:06:55
Ok dałem radę. :)
Dzięki za pomoc.
P-111721
« 1 »
  Strona 1 z 1