Lineární seznam – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Lineární seznam – C / C++ – Fórum – Programujte.comLineární seznam – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
haha0
Newbie
29. 1. 2015   #1
-
0
-

 Ahoj, prosím, mám daný seznam a v něm udělat 2 úkoly:

a) vypsat všechny lidi s váhou větší než 100 kg

b) najít a vypsat všechny lidi s daným věkem

Děkuji moc, zachrání mi to život!

#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);

}
Nahlásit jako SPAM
IP: 147.32.8.–
q
~ Anonymní uživatel
219 příspěvků
29. 1. 2015   #2
-
0
-

Všechny potřebné operace už tam máš. Přidat if určitě zvládneš.

Tys to celé od někoho obšlehl a kašleš na to, viď?   

Nahlásit jako SPAM
IP: 78.156.159.–
haha0
Newbie
29. 1. 2015   #3
-
0
-

Kam přidat if, prosímtě?

Nahlásit jako SPAM
IP: 147.32.8.–
KIIV
~ Moderátor
+43
God of flame
29. 1. 2015   #4
-
0
-

#3 haha
je to neco jako vypis, ale podnimeny... takze pravdepodobne udelas kopii vypisu celyho listu (ne jen jedne polozky) a pred  vypis prvek napises if (vaha aktualniho cloveka je vetsi nez tolik a tolik) vypisCloveka(aktualni_clovek);

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
haha0
Newbie
29. 1. 2015   #5
-
0
-

#4 KIIV
Můžeš mi to prosím napsat, jak to má vypadat?

Nahlásit jako SPAM
IP: 147.32.8.–
KIIV
~ Moderátor
+43
God of flame
29. 1. 2015   #6
-
+1
-
Zajímavé

   

// beznadejny - takze vezmes tohle:
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);
}

// udelas cca tohle:
void vypisMetrackySeznam(Clovek * current) // zadny kopirovani !!!
    while (current != nullptr) // na zacatku je to lepsi, nemusi se to resit pres kdo vi jaky kopie cloveka a zjistovani adres!
    {
        if (current->vaha > 100.0) vypisCloveka(*current); // a ted to nejneuveritelnejsi! PODMINKA, ze nekdo vazi vic nez 100 kilo!!!! NESKUTECNE NAROCNE

        current = current->dalsi; // tohle se samozrejme do ifu nedava, jinak bysme se honili za vlastnim ocasem do nekonecna, jakmile by tam byl nekdo pod 100 kilo
    }

    // tady najednou neni potreba vypisovat uplne posledniho, jelikoz zjistujeme nullptr u aktualniho
}

samozrejme to pak nesmis volat s dereferencovynym clovekem, ale predhodis tomu rovnou pointer

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
29. 1. 2015   #7
-
0
-

Krom toho by to vypadalo mnohem lip, kdyby vas ve skole neucili historii programovani (tohle odpovida C style programovani, v C++ nepouzivaneho (leda tak za trest na skolach - pro nauceni se "Jak se to presne nema nikdy delat") uz nekdy od cca 80 let minulyho stoleti plus/minus dekada)

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
haha0
Newbie
1. 2. 2015   #8
-
0
-

#7 KIIV
Díky moc! A nevíš prosímtě, jak by to bylo, kdybych musel najít člověka s nejnižší váhou a vypsat jej? 

Nahlásit jako SPAM
IP: 46.227.171.–
KIIV
~ Moderátor
+43
God of flame
1. 2. 2015   #9
-
0
-

#8 haha
bys musel mit jeste jeden pointer na pamatovani si cloveka s minimem (na zacaku ho nainicializujes stejne jako ten kterym prochazis (nejnizsi vahu bude mit na zacatku prvni clovek) a kdyz najdes nekoho s mensi vahou, tak ho tam ulozis

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
haha0
Newbie
1. 2. 2015   #10
-
0
-

#9 KIIV
Jak to má zhruba vypadat? Pomůžeš mi tím..

Nahlásit jako SPAM
IP: 46.227.171.–
ondrej39+1
Věrný člen
1. 2. 2015   #11
-
0
-

#10 haha
Jak ti KIIV udělal iterační metodu pro výpis celého seznamu, tak stejným způsobem projedeš seznam i v metodě pro nalezení člověka s nejnižší váhou, akorát když se splní podmínka, změní se pointer na osobu s nejnižší váhou...

//kromě pointeru na první prvek si zaeviduješ pointer na prvek
//s nejmenší váhou

Clovek * Current = &prvni;
Clovek * Nejmensi = Current;

//uvnitř cyklu pro projití celého seznamu

if (Current->Vaha() < Nejmensi->Vaha())
	Nejmensi = Current;

Doplnění: Tato funkce by logicky měla vracet raw pointer na člověka s nejmenší hmotností, nikoli mít nenávratový typ Void, jako u výpisu seznamu, abys s danou osobou poté mohl pracovat.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
haha0
Newbie
1. 2. 2015   #12
-
0
-

#11 ondrej39
Můžeš mi prosím prosím napsat, jak to má být teda?

Nahlásit jako SPAM
IP: 46.227.171.–
ondrej39+1
Věrný člen
1. 2. 2015   #13
-
0
-

#12 haha
však jsem ti to napsal. Zkus to, co jsem ti poslal, zkombinovat s kódem který ti napsal KIIV, při správném postupu ti to bude dělat to, co má. :-)

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
haha0
Newbie
1. 2. 2015   #14
-
0
-

#13 ondrej39
A prosímtě ještě, kam to if mám přesně zakomponovat?

Nahlásit jako SPAM
IP: 46.227.171.–
ondrej39+1
Věrný člen
1. 2. 2015   #15
-
0
-

#14 haha
Zkus hádat...

Připojen obrázek.


Pochopitelně ta podmínka bude v tvém případě vypadat trošku jinak, protože nebudeš spouštět metodu Vaha() pro získání váhy daného člověka, ale budeš pravděpodobně porovnávat přímo public proměnnou vaha, kterou máš nadefinovanou jako float, v tvé struktuře člověk.

Nezapomeň poté na konci metody vrátit pointer na uživatele s nejmenší váhou.

Toto je vcelku snadná aritmetika, základní operace s pointery a podmínkami, zkus se nad problémem trošku zamyslet a ne jen slepě opisovat to, co ti třeba KIIV poslal. :) Hodně štěstí.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 57 hostů

Podobná vlákna

Linearni seznam — založil pidgin

Python - lineární seznam — založil Tomáš

Pomoc linearni seznam — založil Honza

Lineární seznam - sort — založil Oromis

Linearní spojový seznam — založil Rivers

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý