R. 45 - zadanie domowe - ppkt. a - prośba o sprawdzenie
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!

R. 45 - zadanie domowe - ppkt. a - prośba o sprawdzenie

AutorWiadomość
Temat założony przez niniejszego użytkownika
R. 45 - zadanie domowe - ppkt. a - prośba o sprawdzenie
» 2019-06-18 18:39:35
Cześć wszystkim!

Wykonałem zadanie domowe z ppkt. a z rozdziału 45. Mam pytanie: czy zadanie jest dobrze zrobione? Czy na tym poziomie kursu można to zrobić lepiej?

C/C++
#include <iostream>

using namespace std;

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

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

// Dodaj element na poczatek listy
void dodajPoczatek( Lista *& lista, int liczba )
{
    // Tworzymy nowy element listy
    Lista * nowy = new Lista;
    nowy->liczba = liczba;
    nowy->ogon = nullptr;
   
   
    if( lista )
    {
        nowy->ogon = lista;
        lista = nowy;
    }
    else
    {
        lista = new Lista;
        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;
   
    cout << "Podaj liczby, 0 lub blad konczy:\n";
   
    while( cin >> liczba && liczba )
         dodajPoczatek( lista, liczba );
   
    cout << "Koniec, oto liczby:\n";
    wypisz( lista );
    zniszcz( lista );
   
}
P-174809
» 2019-06-18 19:12:53
Mam dobry test na to, czy ktoś rozumie kod, który napisał w tym zadaniu: Jeśli dodajPoczatek() wygląda podobnie do dodajKoniec(), to znaczy że nie zrozumiał. U ciebie wygląda podobnie. Pomijam oczywiste błędy, jak podwójne alokowanie pamięci.

Czemu taki test? Bo dany w zadaniu kod do dodawania na koniec listy wygląda jak wygląda, bo dodawanie na koniec listy jest znacznie bardziej skomplikowane niż dodawanie na początek listy. Dodawanie na początek listy to 3 linie kodu, dodawanie na koniec listy to wyszukiwanie końca listy, jeśli lista nie jest pusta, a wtedy dopiero te 3 linie kodu.
P-174810
» 2019-06-19 18:01:20
Nie chcę zakładać nowego wątku, więc się doczepie tutaj
Chciałbym zasięgnąć informacji.
W zadaniu jest takie zdanie
"Lista powinna wtedy zawierać liczby w przeciwnej kolejności i tak też je wypisać."
nie za bardzo je rozumiem, więc z ilustruje to może tak

czy funkcja void dodajPoczatek( Lista *& lista, int liczba );
ma tak samo działać jak funkcja push_front()
list.push_front(7);

żebym dobrze zrozumiał, jeżeli w liscie (strukturze) znajdują się już elementy
np. 1, 2, 3, 4, 5
to po wywołaniu funkcji dodajPoczatek()
wpisuje kolejno, taki pseudo kod

dodajPoczatek(lista,7)
dodajPoczatek(lista,8)
dodajPoczatek(lista,9)

moja lista powinna wygladaæ tak: 9, 8, 7, 1, 2, 3, 4, 5

Zadanie już rozwiązałem, tylko chcę się upewnić,
czy o taki wynik (działanie programu) chodzi?
P-174811
» 2019-06-19 19:04:28
O to chodziło.
P-174812
Temat założony przez niniejszego użytkownika
» 2019-06-19 21:15:16
Ok. Czyli - wolę dopytać dla pewności - funkcja dodajPoczątek powinna tak wyglądać?

C/C++
void dodajPoczatek( Lista *& lista, int liczba )
{
    Lista * nowy = new Lista;
    nowy->liczba = liczba;
    nowy->ogon = lista;
    lista = nowy;
}

EDIT.

dodawanie na koniec listy to wyszukiwanie końca listy, jeśli lista nie jest pusta, a wtedy dopiero te 3 linie kodu.

Ale rozumiem, że da się to zrobić bez wyszukiwania końca listy? Bo chyba do tego sprowadza się ppkt b?
P-174813
» 2019-06-19 21:27:43
Kod jest poprawny. Dobrze rozumiesz, że się da.
P-174814
Temat założony przez niniejszego użytkownika
» 2019-06-19 22:39:25
Problem rozwiązany, temat do zamknięcia.

Bardzo dziękuję za pomoc!
P-174815
« 1 »
 Strona 1 z 1