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

R. 45 - zadanie domowe - pytanie do ppkt b

Ostatnio zmodyfikowano 2019-09-17 20:14
Autor Wiadomość
rottingham
Temat założony przez niniejszego użytkownika
R. 45 - zadanie domowe - pytanie do ppkt b
» 2019-06-20 18:35:33
Cześć Wszystkim!

W treści zadania jest napisane:
Znajdź sposób na to, by dodawanie elementów na oba końce listy nie wymagało odwiedzania wszystkich węzłów.
To znaczy, że mam napisać kod, który dodaje liczby albo na początek albo na koniec bez przechodzenia przez wszystkie węzły? Czy też program ma od razu dodawać liczby na początek i na koniec listy?
P-174816
pekfos
» 2019-06-20 18:40:14
Operacje dodawania na początek i koniec listy mają być wykonywane w czasie stałym (niezależnym od ilości elementów w liście). Nie musisz w kodzie użyć obu, ale obie mają mieć właściwą złożoność. Inaczej możesz powiedzieć, że twoja lista jest odwrócona, więc dodawanie na początek jest tak na prawdę dodawaniem na koniec, a dodawanie na "początek" jest wtedy wolne, a nie odwrotnie.
P-174817
rottingham
Temat założony przez niniejszego użytkownika
» 2019-06-23 14:42:46
Kompletnie nie rozumiem tego co do mnie napisałeś.

Sednem mojego pytania było:

Czy przy takich danych wejściowych:
1 2 3
 ?

Powinienem otrzymać takie dane wyjściowe:
3 2 1 1 2 3
 ?
P-174829
pekfos
» 2019-06-23 15:07:58
Zadanie nic nie mówi o tym, co ma robić program. Masz zoptymalizować funkcję dodajKoniec(). Wciąż ma realizować taką samą funkcjonalność, więc nawet jakbyś chciał, nie rozróżnisz wersji przed i po patrząc tylko na dane wyjściowe.
P-174830
rottingham
Temat założony przez niniejszego użytkownika
» 2019-06-23 17:31:23
Czyli taki kod (pomimo, że dodaje tylko na koniec) jest prawidłowym rozwiązaniem zadania domowego?

C/C++
#include <iostream>


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

struct Adres
{
    Lista * ostatni;
} * wsk = new Adres;

// 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 )
{
    lista = wsk->ostatni;
   
    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 )
    {
        wsk->ostatni = ostatni( lista )->ogon = nowy;
    }
    else
         wsk->ostatni = 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 );
}
P-174831
pekfos
» 2019-06-23 17:51:54
Nie jest poprawne, bo nie ma sensu. Wcześniej można było mieć dwie niezależne listy, teraz się nie da.
P-174832
rottingham
Temat założony przez niniejszego użytkownika
» 2019-06-23 18:10:41
Wcześniej można było mieć dwie niezależne listy

W jaki sposób?
P-174833
pekfos
» 2019-06-23 18:19:01
C/C++
int main()
{
    Lista * lista1 = nullptr, * lista2 = nullptr;
    dodajKoniec( lista1, 1 );
    dodajKoniec( lista2, 2 );
    dodajKoniec( lista1, 3 );
    dodajKoniec( lista2, 4 );
    wypisz( lista1 );
    std::cout << '\n';
    wypisz( lista2 );
    zniszcz( lista1 );
    zniszcz( lista2 );
}
P-174834
« 1 » 2 3 4 5 6
  Strona 1 z 6 Następna strona