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

lista jednokierunkowa a wskaźnik do wskaźnika

Ostatnio zmodyfikowano 2016-12-23 16:09
Autor Wiadomość
masterkwi
Temat założony przez niniejszego użytkownika
lista jednokierunkowa a wskaźnik do wskaźnika
» 2016-12-23 14:35:32
C/C++
#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; }
} //push
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?
P-155328
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.
P-155330
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

P-155334
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

C/C++
#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;
       
    }
   
}
P-155337
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
C/C++
#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;
} //push
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
C/C++
#include<iostream>
#include<memory>
using namespace std;

//zmieniłem nazwę klasy "lista" na "element". Ciało klasy zostaje
struct element {
    int value;
    element * next;
   
    element( int value = 0 )
        : value( value )
         , next( nullptr )
    { }
   
   
};
// dopisałem klasę lista
class lista {
    element * glowa;
    element * podstawa;
public:
    lista() {
        podstawa = new element( 0 ); //wydaje mi się czytelniejsze stworzyć podstawę
        //niż bawić się z ifami w celu wykrycia/ że dodawany element jest pierwszym (podstawą)
        glowa = podstawa;
    }
    void push( int val ) { // twoja funkcja push
        element * temp;
        temp = new element( val );
        glowa->next = temp;
        glowa = temp;
        //glowa->next = nullptr; //zbędne. Klepnołem z rozpędu. Konsturktor elementu załatwia sprawę
    }
    ~lista() {
        //zadanie do implementacji
    }
    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();
}
P-155338
« 1 »
  Strona 1 z 1