IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: C++ lineární spojový seznam - úkol

Aktivity
Avatar
wejunka.l
Člen
Avatar
wejunka.l:1.2.2015 17:31

Ahoj, potřebovala bych pomoci s úkolem. Mám lineární spojový seznam a mám úkol - vypsat člověka s nejnižším věkem. Jenže nějak nevím, jak na to. Mohl by mi prosím někdo poradit? Už jsem zoufalá.

Zdroják:

#include <iostream>
#include <stdlib.h>

using namespace std;

struct Clovek {
    short vek;
    float vaha;
    char jmeno[50];
    Clovek* dalsi;
};


void vypisCloveka(Clovek c)
{
    cout << c.vek << endl;
    cout << c.vaha << endl;
    cout << c.jmeno << endl;
}

void vypisNtehoCloveka(Clovek prvni, int N)
{
    if (N <= 0)
    {
        vypisCloveka(prvni);
    }
    else
    {
        Clovek* current = prvni.dalsi;
        for (int i = 1;i < N;i++)
        {
            if (current->dalsi != nullptr) // Nejsme na poslednim vagone?
            {
                current = current->dalsi; // Prechod k dalsimu vagonku
            }
            else
            { // Jsme na poslednim
                cout << "N je vetsi nez delka spojoveho seznamu" << endl;
                return;
            }
        }
        vypisCloveka(*current);
    }
}

void vlozDoSeznamu(Clovek* loko, Clovek* kdo) // Vlozi clovek "kdo" do spojoveho seznamu zacinajici "loko"
{
    Clovek* current = loko;
    while (current->dalsi != nullptr) // Dojde k poslednimu prvku seznamu
    {
        current = current->dalsi;
    }

    // Pripoji "kdo" za posledni prvek => "kdo" se stava poslednim prvkem
    current->dalsi = kdo;
    kdo->dalsi = nullptr;
}

int spocitejPrvky(Clovek prvni)
{
    int pocitadlo = 1;

    Clovek* current = &prvni;
    while (current->dalsi != nullptr)
    {
        pocitadlo = pocitadlo+1; // to stejne jako pocitadlo++
        current = current->dalsi;
    }

    return pocitadlo;
}

void vypisCelySeznam(Clovek prvni)
{
    Clovek* current = &prvni;
    do //Pouzijeme do-while aby se vypsal i prvni prvek (je-li v seznamu jediny)
    {
        vypisCloveka(*current);
            current = current->dalsi;
    }
    while (current->dalsi != nullptr);

    // Musime vypsat jeste toho posledniho
    vypisCloveka(*current);
}

Clovek* vratNtehoCloveka(Clovek* loko,unsigned int N)
{

    int pocitadlo = 1;

    Clovek* current = loko;
    while (current->dalsi != nullptr && pocitadlo != N) // dokud nejsme na konci a jeste jsme nedosahli N
    {
        pocitadlo = pocitadlo+1; // to stejne jako pocitadlo++
        current = current->dalsi;
    }

    return current;
}

void odstranZeSeznamu(Clovek* loko, int kolikaty)
{
    int pocetPrvku = spocitejPrvky(*loko);

    // Odstranujeme prvek nekde uvnitr vlaku?
    if (kolikaty > 1 && kolikaty < pocetPrvku)
    {
        Clovek* tenCoMazu = vratNtehoCloveka(loko,kolikaty);
        Clovek* tenPredNim = vratNtehoCloveka(loko, kolikaty-1);
        Clovek* tenZaNim = vratNtehoCloveka(loko, kolikaty+1);

        tenPredNim->dalsi = tenZaNim;

        delete tenCoMazu;
    }

    // Jsme na poslednim vagonu a je tam vic vagonu nez jen loko?
    if (kolikaty == pocetPrvku && pocetPrvku > 1)
    {
        Clovek* tenCoMazu = vratNtehoCloveka(loko,kolikaty);
        Clovek* tenPredNim = vratNtehoCloveka(loko, kolikaty-1);

        tenPredNim->dalsi = nullptr;
        delete tenCoMazu;
    }
}


void smazCelySeznam(Clovek* loko)
{

    Clovek* current = loko;
    while (current->dalsi != nullptr)
    {
        // Pozor abych si nesmazal neco, co jeste potrebuju
        Clovek* tenCoMazu = current;
        current = current->dalsi;
        delete tenCoMazu;
    }

    delete current;
}


void nactiCloveka(Clovek* kdo)
{
    cout << "Zadejte vek cloveka: " << endl;
    cin >> kdo->vek;

    cout << "Zadejte vahu cloveka: " << endl;
    cin >> kdo->vaha;

    cout << "Zadejte jmeno cloveka: " << endl;
    cin.ignore();
    gets_s(kdo->jmeno); // Tato funkce nam nacte retezec ze standardniho vstupu
    kdo->dalsi = nullptr;
}


Clovek* prvniPrvek = nullptr;


void main()
{
    for (int i=0;i<2;i++)
    {
        Clovek* novy = new Clovek;
        nactiCloveka(novy);

        if (prvniPrvek == nullptr)
        {
            prvniPrvek = novy;
        }
        else
        {
            vlozDoSeznamu(prvniPrvek,novy);
        }

        cout << "Clovek byl vlozen do seznamu." << endl;
    }

    cout << endl;
    cout << "Vypisuji seznam:" << endl;

    // Vsichni jsou uz jiz nacteni, vypis cely seznam
    vypisCelySeznam(*prvniPrvek);

    // Koncime praci s programem, takze smazeme seznam
    smazCelySeznam(prvniPrvek);

    int c;
    cin >> c;

    smazCelySeznam(prvniPrvek);

}
 
Odpovědět
1.2.2015 17:31
Avatar
Jan Vargovský
Tvůrce
Avatar
Jan Vargovský:1.2.2015 18:08

Využiju toho co mám, ne? :) stačí proiterovat celý seznam a nechávat si pointer na ten s nejnižším věkem.

Clovek* NajdiSNejnizsimVekem(Clovek* prvni)
{
        Clovek* nejmensi = prvni;
        Clovek* aktualni = prvni;
        do
        {
                if (nejmensi->vek > aktualni->vek)
                        nejmensi = aktualni;
                aktualni = (aktualni->dalsi);
        } while (aktualni != nullptr);
        return nejmensi;
}
 
Nahoru Odpovědět
1.2.2015 18:08
Avatar
wejunka.l
Člen
Avatar
Odpovídá na Jan Vargovský
wejunka.l:1.2.2015 18:45

Mám to podobně:

Clovek* NajdiSNejnizsimVekem(Clovek* prvni)
 {
     Clovek* current = prvni;
     Clovek* nejmensi = current;

        do
        {
            if (nejmensi->vek > current->vek)
                        {
             nejmensi = current;
                        }
             current = (current->dalsi);
                }
                while (current != nullptr);

        return nejmensi;
 }

Ale nechce mi to vypsat.. A nějak nevím, kde je přesně chyba..

 
Nahoru Odpovědět
1.2.2015 18:45
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na wejunka.l
Jan Vargovský:1.2.2015 18:46

Jakým způsobem to voláš?

 
Nahoru Odpovědět
1.2.2015 18:46
Avatar
wejunka.l
Člen
Avatar
Odpovídá na Jan Vargovský
wejunka.l:1.2.2015 19:01

Když jsem měla vyhledat lidi, kteří váží více jako 100kg, tak jsem to volala stejně.. Ale teď mi to nechce vypsat.

void main()
{
    for (int i=0;i<2;i++)
    {
        Clovek* novy = new Clovek;
        nactiCloveka(novy);

        if (prvniPrvek == nullptr)
        {
            prvniPrvek = novy;
        }
        else
        {
            vlozDoSeznamu(prvniPrvek,novy);
        }

        cout << "Clovek byl vlozen do seznamu." << endl;
    }


    cout << endl;
    cout << "Vypisuji seznam:" << endl;

    NajdiSNejnizsimVekem(prvniPrvek);

    /*// Vsichni jsou uz jiz nacteni, vypis cely seznam
    vypisCelySeznam(*prvniPrvek);*/

    // Koncime praci s programem, takze smazeme seznam
    smazCelySeznam(prvniPrvek);

    int c;
    cin >> c;

    smazCelySeznam(prvniPrvek);

}
 
Nahoru Odpovědět
1.2.2015 19:01
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na wejunka.l
Jan Vargovský:1.2.2015 19:03

Protože ho nikde nevypisuješ...

Clovek* clovek = NajdiSNejnizsimVekem(prvniPrvek);
cout << clovek->vek << endl;
 
Nahoru Odpovědět
1.2.2015 19:03
Avatar
wejunka.l
Člen
Avatar
Odpovídá na Jan Vargovský
wejunka.l:1.2.2015 19:20

Jo vlastně.. Děkuju moc!
A ještě otázka - vypíše mi to jen věk. Ale potřebovala bych s tím věkem vypsat i jméno a váhu.

 
Nahoru Odpovědět
1.2.2015 19:20
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na wejunka.l
Jan Vargovský:1.2.2015 19:27

Tak využij te funkce, kterou už jsi naprogramovala, ne?

Clovek* clovek = NajdiSNejnizsimVekem(prvniPrvek);
vypisCloveka(*clovek);
 
Nahoru Odpovědět
1.2.2015 19:27
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.