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ć' #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 :) |
|
Jacob99 |
» 2014-06-19 15:33:30 ty chcesz dodać do stringa liczbę? |
|
Monika90 |
» 2014-06-19 15:41:32 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. |
|
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ę 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 |
|
Monika90 |
» 2014-06-19 16:54:10 Nie będzie ok. Raczej coś w tym stylu: 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ą. |
|
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? ;< |
|
pekfos |
» 2014-06-27 20:17:25 this->right.kod( pre + 1 );
|
this->right.kod( pre + "1" );
|
|
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*'' ? |
|
« 1 » 2 3 |