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

[C++] wskaźniki oraz stringi w funkcjach (kodowanie huffmana)

Ostatnio zmodyfikowano 2014-07-01 15:43
Autor Wiadomość
kinga9650
Temat założony przez niniejszego użytkownika
[C++] wskaźniki oraz stringi w funkcjach (kodowanie huffmana)
» 2014-06-19 15:23:51
Koniec roku szkolnego zbliża się wielkimi krokami, wszystkie programy powinny być poprzesyłane do nauczyciela... No i właściwie to tak jest, ale mimo to pozostał mi jeden niedziałający i fajni byłoby dowiedzieć się jak go 'ożywić'

C/C++
#include <iostream>
#include <queue>
#include <string>

using namespace std;

class element
{
public:
    int key;
    char znak;
    element * left;
    element * right;
    element( char a, int k )
        : key( k )
         , znak( a )
         , left( NULL )
         , right( NULL )
    { };
    element() { };
   
   
    void kod( string pre )
    {
        if( this->znak != NULL ) cout << this->znak << " - " << pre << endl;
        else
        {
            this->right.kod( pre + 1 );
            this->left.kod( pre + 0 );
        }
    }
   
    void kod()
    {
        if( this->znak != NULL ) cout << this->znak << " - 1" << endl;
        else
        {
            this->right.kod( 1 );
            this->left.kod( 0 );
        }
    }
   
};

bool operator <( element po1, element po2 )
{
    if( po1.key < po2.key ) return true;
    else return false;
   
}


int main()
{
    int ileznakow;
    cin >> ileznakow;
   
    priority_queue < element > kolejka;
    char znak;
    int jakczesto;
    element el1, el2, el3;
    for( int i = 0; i < ileznakow; ++i )
    {
        cin >> znak >> jakczesto;
        el1 = element( znak, - jakczesto );
        kolejka.push( el1 );
    }
   
    while( kolejka.size() > 1 )
    {
        el1 = kolejka.top();
        kolejka.pop();
        el2 = kolejka.top();
        kolejka.pop();
        el3.key = el1.key + el2.key;
        el3.znak = NULL;
        el3.left = & el1;
        el3.right = & el2;
        kolejka.push( el3 );
    }
   
    kolejka.top().kod();
   
    return 0;
}

Problemy są 2:
1) nie wiem jak uruchomić funkcję poprzez wskaźnik na element klasy
2) nie wiem jak dołączyć znak do stringa, choć wydaje mi się, że w kodzie jest to zrobione poprawnie (no ale jednak nie jest...)

Z góry dziękuję za wszelką pomoc :)
P-112318
Jacob99
» 2014-06-19 15:33:30
ty chcesz dodać do stringa liczbę?
P-112319
Monika90
» 2014-06-19 15:41:32
C/C++
while( kolejka.size() > 1 )
{
    el1 = kolejka.top();
    kolejka.pop();
    el2 = kolejka.top();
    kolejka.pop();
    el3.key = el1.key + el2.key;
    el3.znak = NULL;
    el3.left = & el1;
    el3.right = & el2;
    kolejka.push( el3 );
}
Niestety, to nie ma prawa działać. W ten sposób nie zbudujesz drzewa. Dziećmi wszystkich węzłów będą te same dwa elementy el1 i el2. Powinnaś użyć kolejki wskaźników do węzłów i tworzyć nowe węzły za pomocą new.
P-112320
kinga9650
Temat założony przez niniejszego użytkownika
» 2014-06-19 16:33:04
@Jacob99 Tak, z tym że nie ma to być rzecz jasna dodawanie w formie działania, ale dopisania tej liczby na końcu ciągu.

@Monika Czyli jeśli napiszę
C/C++
while( kolejka.size() > 1 )
{
    el1 = new element;
    el1 = kolejka.top();
    kolejka.pop();
    el2 = new element;
    el2 = kolejka.top();
    kolejka.pop();
    el3 = new element;
    el3.key = el1.key + el2.key;
    el3.znak = NULL;
    el3.left = & el1;
    el3.right = & el2;
    kolejka.push( el3 );
}
to powinno być ok?
* Poza tym nie eliminuje to co prawda pozostałych problemów, ale dobrze wiedzieć, że jest tam jeszcze więcej błędów ;p
P-112328
Monika90
» 2014-06-19 16:54:10
Nie będzie ok. Raczej coś w tym stylu:
C/C++
while( kolejka.size() > 1 )
{
    element * e1 = kolejka.top();
    kolejka.pop();
    element * e2 = kolejka.top();
    kolejka.pop();
    element * e3 = new element;
    e3->key = e1->key + e2->key;
    e3->left = e1;
    e3->right = e2;
    kolejka.push( e3 );
}
tzn. elementami kolejki muszą być wskaźniki do elementów, wymaga to zdefiniowania własnego komparatora, żeby te wskaźniki porównywał wg priorytetów elementów na które wskazują.
P-112330
kinga9650
Temat założony przez niniejszego użytkownika
» 2014-06-27 19:45:14
Ok, zastosowałam się do tej wskazówki. Tyle że program dalej nie działa, bo błędy wyskakują siłą rzeczy te same. Pomoże ktoś jeszcze w ich rozwiązaniu? ;<
P-112859
pekfos
» 2014-06-27 20:17:25
C/C++
this->right.kod( pre + 1 );
C/C++
this->right.kod( pre + "1" );
P-112860
kinga9650
Temat założony przez niniejszego użytkownika
» 2014-06-27 21:10:56
Dziękuję, że też na to nie wpadłam!

@Monika, właśnie zauważyłam, że przy takim rozwiązaniu wyskakuje mi błąd, a nawet 3. Z tego co rozumiem w każdym z el1, el2 i el3 przy wywoływaniu powstaje const element, a kompilator potrzebuje element* i nie potrafi tego przekonwertować (?)

Chyba będzie to błąd podobny do tego w 23 linijce, gdzie wyskakuje mi, że this->righ/left 'is of non-class type 'element*'' ?
P-112862
« 1 » 2 3
  Strona 1 z 3 Następna strona