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