Funkcje i wskazniki
Ostatnio zmodyfikowano 2017-09-30 02:02
natofp Temat założony przez niniejszego użytkownika |
Funkcje i wskazniki » 2017-09-30 00:32:33 Witam, czytam właśnie o tworzeniu drzew binarnych. Ponizszy program ma za zadanie wczytac drzewo binarne ( definicje poszczegolnych wezlow) oraz wypisac je graficznie do ekranu konsoli: (po kodzie źródłowym moje pytanie, co do niego)
#include <iostream> #include <string> #include <cstdlib> #include <ctime>
using namespace std;
struct BSTNode { BSTNode * up, * left, * right; int key; };
string cr, cl, cp;
void printBT( string sp, string sn, BSTNode * v ) { string s; if( v ) { s = sp; if( sn == cr ) s[ s.length() - 2 ] = ' '; printBT( s + cp, cr, v->right ); s = s.substr( 0, sp.length() - 2 ); cout << s << sn << v->key << endl; s = sp; if( sn == cl ) s[ s.length() - 2 ] = ' '; printBT( s + cp, cl, v->left ); } }
void DFSRelease( BSTNode * v ) { if( v ) { DFSRelease( v->left ); DFSRelease( v->right ); delete v; } }
void insertBST( BSTNode * & root, int k ) { BSTNode * w, * p; w = new BSTNode; w->left = w->right = NULL; w->key = k; p = root; if( !p ) root = w; else while( true ) if( k < p->key ) { if( !p->left ) { p->left = w; break; } else p = p->left; } else { if( !p->right ) { p->right = w; break; } else p = p->right; } w->up = p; }
int main() { BSTNode * root = NULL; int i, k; cr = cl = cp = " "; cr[ 0 ] = 218; cr[ 1 ] = 196; cl[ 0 ] = 192; cl[ 1 ] = 196; cp[ 0 ] = 179; srand( time( NULL ) ); for( i = 0; i < 20; i++ ) { k = 1 + rand() % 9; cout << k << " "; insertBST( root, k ); } cout << endl << endl; printBT( "", "", root ); DFSRelease( root ); return 0; }
Funckja insertBST() przyjmuje jako parametr int * &root; Co oznacza ten zapis? (Wiem jakie są rodzaje przekazywania parametrów do funcji, ale tego nie rozumiem) Dlaczego po usunięciu znaku "&" i zostawieniu jako parametru int * root program nie tworzy zadnego drzewa? (Sprawdzałem sam). |
|
Kinexity |
» 2017-09-30 00:40:50 referencja do wskaźnika |
|
YooSy |
» 2017-09-30 02:02:51 Przekazując wskaźnik przez kopię, działasz na tej kopii i po wyjściu z funkcji tracisz wszystkie operacje. Po to przekazuje się wskaźnik przez referencję. Analogicznie do zmiennej przekazanej przez referencję. Przykład powinien trochę wyjaśnić problem: void Fun( int * p ) { int * tmp = new int { 2 }; p = tmp; }
void Fun2( int *& p ) { int * tmp = new int { 3 }; p = tmp; }
int main() { int * ptr = new int { 1 }; cout << "&ptr: " << ptr << ", *ptr: " << * ptr << endl; Fun( ptr ); cout << "&ptr: " << ptr << ", *ptr: " << * ptr << endl; Fun2( ptr ); cout << "&ptr: " << ptr << ", *ptr: " << * ptr << endl; delete ptr; }
Możliwe wyjście: &ptr: 0000000000263F40, *ptr: 1 &ptr: 0000000000263F40, *ptr: 1 &ptr: 0000000000263FC0, *ptr: 3 |
|
« 1 » |