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
Lekcja 45 - Zadanie domowe podpunkt 2 - problem ze zrozumieniem zadania - mile widziane wskazówki.
» 2018-04-28 16:09:03
Witam,  Mam problem ze zrozumieniem treści zadania, o co chodzi autorowi.

O to treść:

Zwróć uwagę, że dodajKoniec() używa funkcji ostatni(), a więc dodanie 1001. liczby wymaga przejścia przez 1000 węzłów tylko po to, by znaleźć koniec listy. Znajdź sposób na to, by dodawanie elementów na oba końce listy nie wymagało odwiedzania wszystkich węzłów.
Podpowiedź: Możesz potrzebować drugiego struct.

O to kod źródlowy programu który należy zmodyfikować/przeanalizować:
C/C++
#include <iostream>


struct Lista
{
    Lista * ogon;
    int liczba;
};

// Wypisz wszystkie elementy listy
void wypisz( Lista * lista )
{
    // Przechodzenie po liście *rekurencyjnie*
    if( lista )
    {
        std::cout << lista->liczba << ", ";
        wypisz( lista->ogon );
    }
}


// Zwróć: wskaźnik na ostatni element listy
Lista * ostatni( Lista * lista )
{
    // Przechodzenie po liście *iteracyjnie*
    if( lista )
    while( lista->ogon )
         lista = lista->ogon;
   
    return lista;
}


// Dodaj element na koniec listy
void dodajKoniec( Lista *& lista, int liczba )
{
    // Tworzymy nowy element listy
    Lista * nowy = new Lista;
    nowy->liczba = liczba;
    nowy->ogon = nullptr;
   
    // Dopisujemy na koniec
    if( lista )
         ostatni( lista )->ogon = nowy;
    else
         lista = nowy;
   
}


// Usuwa listę
void zniszcz( Lista *& lista )
{
    while( lista )
    {
        Lista * tmp = lista;
        lista = lista->ogon;
        delete tmp;
    }
   
    lista = nullptr;
}


int main()
{
    int liczba;
    Lista * lista = nullptr;
    std::cout << "Podaj liczby, 0 lub blad konczy:\n";
   
    while( std::cin >> liczba && liczba )
         dodajKoniec( lista, liczba );
   
    std::cout << "Koniec, oto liczby:\n";
    wypisz( lista );
    zniszcz( lista );
}

Czy Autorowi chodzi o listy dwu kierunkowe, czy o coś innego? Mile widziane wskazówki, serdecznie dziękuję za pomoc w rozwiązaniu zadania!
Btw, jestem tu nowy, bardzo fajny kurs C++'a

P-170847
pekfos
» 2018-04-28 16:18:30
Trudno tu o wskazówkę, która nie będzie bezpośrednio wskazywać sposobu rozwiązania problemu. Zacznijmy od tego, że w żaden sposób nie odniosłeś się do podpowiedzi do zadania. Oraz:
dodanie 1001. liczby wymaga przejścia przez 1000 węzłów tylko po to, by znaleźć koniec listy.
P-170849
Peter_m
Temat założony przez niniejszego użytkownika
» 2018-04-28 16:30:50
Bo dopiero zaczynam wykonywać to zadanie, a nie wiem jak się za nie zabrać, wiem natomiast, że będę potrzebował drugiego Struct, który będzie przechowywał wskaźnik początek i koniec.
I funkcja wypisz będzie korzystać z początku, a funkcja dodaj koniec z końca. Dobrze myślę?
P-170850
pekfos
» 2018-04-28 16:43:13
Tak. Chodzi o to, by mieć jedną strukturę na organizację węzła listy (struktura dana w zadaniu) i drugą na organizację listy jako całości. Wskaźnik na aktualny koniec listy to własność listy jako całości, a nie węzła.
P-170851
Peter_m
Temat założony przez niniejszego użytkownika
» 2018-04-28 16:50:23
A można prosić o rozpisanie tego w kodzie mniej więcej jak to by wyglądało?, nie chce gotowca, tylko przykład.
Bardzo mi to pomoże w rozwiązaniu zadania. Serdecznie dziękuję.
P-170852
pekfos
» 2018-04-28 16:57:43
C/C++
struct Lista // Nowa struktura
{
    Wezel * poczatek;
};

struct Wezel // struktura `Lista` z lekcji
Dla wygody użycia, niech wszystkie funkcje przyjmują obiekt Lista przez referencję, a sam obiekt niech jest utworzony na stosie, a nie alokowany dynamicznie.
C/C++
Lista lista;
utworz( lista ); // nowa funkcja, gdzieś trzeba zainicjalizować elementy struktury
//..
wypisz( lista );
zniszcz( lista );
Zacznij od przerobienia kodu, by tak wyglądał. Potem dopiero zajmij się optymalizowaniem dodawania elementów na koniec.
P-170853
Peter_m
Temat założony przez niniejszego użytkownika
» 2018-04-28 17:55:12
Wybacz, Ale nadal nie potrafię sobie tego wyobrazić. kod już mam przygotowany, według wskazówki.
P-170854
pekfos
» 2018-04-28 18:28:49
W tym zestawie funkcji, dodajKoniec() to jedyny sposób, w jaki węzeł może stać się końcem listy. Więc jeśli w tej funkcji zapiszesz sobie gdzieś wskaźnik na ostatni węzeł danej listy, to w następnym wywołaniu nie będziesz musiał go szukać.
P-170855
« 1 » 2 3
  Strona 1 z 3 Następna strona