lista jednokierunkowa a wskaźnik do wskaźnika
Ostatnio zmodyfikowano 2016-12-23 16:09
masterkwi Temat założony przez niniejszego użytkownika |
lista jednokierunkowa a wskaźnik do wskaźnika » 2016-12-23 14:35:32 #include<stdio.h> #include <stdlib.h>
typedef struct REF { int value; struct REF * next; } ref;
void push( int x, ref ** h ) { ref * p; p =( ref * ) malloc( sizeof( ref ) ); if( p != NULL ) { p->value = x; p->next = * h; * h = p; } } void druklista( ref * h ) { printf( "{" ); while( h != NULL ) { printf( "%d", h->value ); h = h->next; if( h != NULL ) printf( "," ); } printf( "}\n" ); }
int main() { ref * list; push( 1, & list ); push( 2, & list ); push( 3, & list ); druklista( list ); }
Nie rozumiem dlaczego w funkcji push musi być wskaźnik do wskaźnika a nie sam wskaźnik do h czy chodzi o to że jak mamy wskaźnik do wskaźnika to wklejamy całą listę a tak to byśmy wklejali pierwszy element? |
|
mokrowski |
» 2016-12-23 14:42:12 Spoko... tylko mam prośbę, nazwij zmienne normalnie a wiele Ci się wyjaśni. A tego kto napisał taki kod to ... "skołczuj" (no chyba że wykładowca :-) ). p to wydaje się być prev? h to .. head?
No dobra.. wskaźnik do wskaźnika bo masz przypisanie z wyłuskaniem do p->next które przechowuje wskaźnik. |
|
mateczek |
» 2016-12-23 14:55:47 chcąc zmienić wartość "list" masz dwa wyjścia:
1 przekazać "list" do funkcji przez referencję 2 zrobić wskaźnik do "list" (i tu Ci wychodzi wskaźnik do wskaźnika)
kod jest skopany !!! ma błąd powodujący segfault. i wskaźnik "lista" traktuje jak głowę, co jest błędem. Bo nie ma prawa zadziałać drukowanie listy
|
|
masterkwi Temat założony przez niniejszego użytkownika |
» 2016-12-23 15:31:00 jak próbuję zaimplementować push w c++ to mam błąd w push i nie wiem dlaczego #include<iostream> #include<memory> using namespace std;
struct lista { int value; unique_ptr < lista > next; lista( int value ) : value( value ) , next( nullptr ) { } }; void push( int x, unique_ptr < lista > & h ) { unique_ptr < lista > alok_pam_x = make_unique < lista >( x ); if( alok_pam_x != nullptr ) { alok_pam_x->next = h; h = alok_pam_x; } }
|
|
mateczek |
» 2016-12-23 16:09:52 jakoś tak poprawiłem by nie było błędów typu segFault zostaje jeszcze zwalnianie pamięci :P #include<stdio.h> #include <stdlib.h>
struct REF { int value; struct REF * next; };
void push( int x, REF ** h ) { REF * p; p =( REF * ) malloc( sizeof( REF ) ); p->value = x; ( * h )->next = p; ( * h ) = p; ( * h )->next = NULL; } void druklista( REF * h ) { printf( "{" ); while( h != NULL ) { printf( "%d", h->value ); h = h->next; if( h != NULL ) printf( "," ); } printf( "}\n" ); }
int main() { REF podstawa; REF * glowa; podstawa.value = 0; podstawa.next = NULL; glowa = & podstawa; push( 1, & glowa ); push( 2, & glowa ); push( 3, & glowa ); druklista( & podstawa ); } Na klasach w c++. z inteligentnymi wskaźnikami jeszcze nie eksperymentowałem więc narzazie nie próbuje #include<iostream> #include<memory> using namespace std;
struct element { int value; element * next; element( int value = 0 ) : value( value ) , next( nullptr ) { } };
class lista { element * glowa; element * podstawa; public: lista() { podstawa = new element( 0 ); glowa = podstawa; } void push( int val ) { element * temp; temp = new element( val ); glowa->next = temp; glowa = temp; } ~lista() { } void print() { element * temp = podstawa; while( temp ) { cout << temp->value << " "; temp = temp->next; } cout << endl; } }; int main() { lista l; l.push( 23 ); l.push( 45 ); l.push( 77 ); l.print(); }
|
|
« 1 » |