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

Lekcja 45 - Zadanie domowe podpunkt 2 - problem ze zrozumieniem zadania - mile widziane wskazówki.

Ostatnio zmodyfikowano 2018-04-30 00:12
Autor Wiadomość
Peter_m
Temat założony przez niniejszego użytkownika
» 2018-04-29 10:27:20
Czyli sugerujesz, że też źle zrobiłem podpunkt 1 z funkcją void dodajpoacztek?
P-170867
pekfos
» 2018-04-29 12:03:38
Zależy co to znaczy źle. Kod działa, ale można mieć wątpliwości, czy wiedziałeś co robisz.
P-170868
Peter_m
Temat założony przez niniejszego użytkownika
» 2018-04-29 12:48:04
Musiałem doczytać z innych źródeł i z wiedzy zawartej w lekcji 45. Nie mniej jednak udało się, działa. Natomiast muszę doczytać jak rozwiązać problem z podpunktu 2, przetrawić to, mam nadzieję, że znowu powiedzie.

Serdecznie dziękuję za cierpliwość nade mną, fakt ta lekcja wymaga większej uwagi i skupienia (przynajmniej ja to tak odbieram)
P-170869
Chowan
» 2018-04-29 20:19:33
masz dodać strukturę, bądź w obecnej dodać wskaźniki do pierwszego i ostatniego węzła i przy dodawaniu kolejnych elementów aktualizować te wskaźniki.
P-170870
Peter_m
Temat założony przez niniejszego użytkownika
» 2018-04-29 20:44:56
Ok, poczyniłem coś takiego:
C/C++
struct Lista //struktura z lekcji 45 kursu CPP0x
{
   
    Lista * ogon; //wezeł
    int liczba;
   
};
struct Wezel //nowa struktura
{
    Lista * lista;
    Lista * ostatni;
};

void utworz( Wezel *& lista, int liczba ) //nowy void utworz
{
    Lista * nowy = new Lista;
    if( nowy )
    {
        if( lista->lista == NULL )
        {
            nowy->liczba = liczba;
            nowy->ogon = NULL;
            lista->lista = lista->ostatni = nowy;
        }
        else
        {
            nowy->liczba = liczba;
            nowy->ogon = NULL;
            lista->ostatni->ogon = nowy;
            lista->ostatni = nowy;
        }
    }
}
void wypisz( Lista * lista )
{
    if( lista )
    {
        cout << lista->liczba << ", ";
        wypisz( lista->ogon );
       
    }
}

Lista * ostatni( Lista * lista )
{
    if( lista )
    while( lista->ogon )
         lista = lista->ogon;
   
    return lista;
   
}


void dodajPoczatek( Lista *& lista, int liczba )
{
    Lista * NewTab = new Lista;
    NewTab->liczba = liczba;
    NewTab->ogon = lista;
    if( NewTab == NULL )
         ostatni( lista )->ogon = NewTab;
    else
         lista = NewTab;
   
}


void dodajKoniec( Lista *& lista, int liczba )
{
   
   
    Lista * nowy = new Lista;
    nowy->liczba = liczba;
    nowy->ogon = NULL;
    if( lista )
         ostatni( lista )->ogon = nowy;
    else
         lista = nowy;
   
   
}

void zniszcz( Lista *& lista )
{
    while( lista )
    {
        Lista * tmp = lista;
        lista = lista->ogon;
        delete tmp;
    }
    lista = NULL;
}
int main()
{
    int liczba;
    Lista * lista = NULL;
   
    cout << "Podaj liczby, o lub blad konczy: \n";
    while( cin >> liczba && liczba )
         dodajKoniec( lista, liczba );
   
    //    while(cin>>liczba &&liczba)
    //     dodajPoczatek(lista, liczba);
   
    cout << "Koniec, o to liczby: \n" << endl;
    utworz( lista ); //wywołanie funkcji utworz.
    wypisz( lista );
    zniszcz( lista );
    return 0;
}


||=== Build file: "no target" in "no project"( compiler: unknown ) === |
E:\k urs\kurs.cpp | 282 | warning
    : "/*" within comment[ - Wcomment ] | E:\k urs\kurs.cpp | 291 | warning
    : "/*" within comment[ - Wcomment ] | E:\k urs\kurs.cpp || In function 'int main()':| E:\k urs\kurs.cpp | 1347 | error
    : invalid initialization of reference of type 'Wezel*&' from expression of type 'Lista*' | E:\k urs\kurs.cpp | 1256 | note
    : in passing argument 1 of 'void utworz(Wezel*&, int)' | ||=== Build failed
    : 1 error( s )
     , 2 warning( s )( 0 minute( s ), 0 second( s ) ) === |
jednak kompilator zwraca błąd.
Gdzie znowu popełniam błąd?
P-170871
Chowan
» 2018-04-29 21:19:37
to co masz napisane w komunikacie, funkcja utworz przyjmuje jako pierwszy argument wskaźnik typu Wezel a ty dałeś tam wskaźnik typu Lista, nie wiem po co jest ta funkcja wgle. Masz też tą strukture Wezel a nie aktualizujesz jej, ani nie korzystasz z niej przy dodawaniu kolejnych elementów.

btw @pekfos poprawił Ci funkcje z dodawaniem elementu na początek, ale chyba nie wziąłeś do serca jego uwag.
P-170872
Peter_m
Temat założony przez niniejszego użytkownika
» 2018-04-29 21:37:47
Funkcję, dodaj poczatek poprawiłem, tylko wstawiłem nie ten kod.
Nie chcę spamować niepotrzebnie. Dlatego sam rozumiesz.
P-170873
Peter_m
Temat założony przez niniejszego użytkownika
» 2018-04-30 00:12:10
Zadziałało.

A więc, faktycznie... jak na spokojnie przysiadłem do tego zadania, to tak jasne uświadomiłem sobie, że brałem to brzydko mówiąc od dupy strony, oraz nie czytając uważnie wskazówek, a także dodatkowy void, zupełnie nie potrzebny.
Co więcej, jak się przyjrzałem przykładowi z kursu to wskaźnik *lista jest tak jak by początkiem listy i wystarczyło dopisać wskaźnik na jego koniec coś jak *koniec.
Oraz w funkcji void dodaj koniec dopisałem wskaźnik na referencję koniec.

C/C++
struct Lista //struktura z lekcji 45 kursu CPP0x
{
   
    Lista * ogon;
    int liczba;
   
};

void wypisz( Lista * lista )
{
    if( lista )
    {
        cout << lista->liczba << ", ";
        wypisz( lista->ogon );
       
    }
}

Lista * ostatni( Lista * lista )
{
    if( lista )
    while( lista->ogon )
         lista = lista->ogon;
   
    return lista;
   
}
void dodajKoniec( Lista *& lista, Lista *& koniec, int liczba ) //dodanie w void jako argument wskaźnik na referencję koniec.
{
   
   
    Lista * nowy = new Lista;
    nowy->liczba = liczba;
    nowy->ogon = NULL;
    if( lista )
         ostatni( koniec )->ogon = nowy;
    else
         lista = nowy;
   
    koniec = nowy;
   
}

void zniszcz( Lista *& lista )
{
    while( lista )
    {
        Lista * tmp = lista;
        lista = lista->ogon;
        delete tmp;
    }
    lista = NULL;
}
int main()
{
    int liczba;
    Lista * lista = NULL;
    Lista * koniec = NULL; //wskaźnik na koniec
    cout << "Podaj liczby, o lub blad konczy: \n";
   
    while( cin >> liczba && liczba )
         dodajKoniec( lista, koniec, liczba ); //wywołanie
   
    cout << "Koniec, o to liczby: \n" << endl;
    wypisz( lista );
    zniszcz( lista );
    return 0;
}
Mam ogromną nadzieję, że właśnie o to chodziło w tym zadaniu.
Fakt, uświadomiłem sobie też, że po długich bataliach ze strukturami danych( a potrzebowałem na to aż 2 dni) można to zadanie zrobić z dodatkowa strukturą, która będzie przechowywać wskaźniki *początek i *koniec.

P-170874
1 2 « 3 »
Poprzednia strona Strona 3 z 3