Portál AbcLinuxu, 25. prosince 2025 23:30
Zdravím, mohl by mi s tím proísm vás někdo pomoc, vbc se nechytám a nevím jak pokračovat. Děkuji za pomoc! Jedná se o jazyk C. Přikládám soubor
Řešení dotazu:
bez papíru/čmárání bokem to fakt jako někdy u víc složitějších věcí nejde ale todleto imho neni ten případ kdyby papír jako něco víc řešil :O ;D
pridanie dat na zaciatok - ekvivalent v realnom zivote, co musim urobit ak chcem pridat novy knizku v kniznici?
jít do knichkupetví koupit knížku najít nejvíc nejvolnější místo v nějakým tom regálku knihovny a tu knížku tam jakoby strašně silou narvat ajeto :D ;D
takle si to ale asi jako nemyslel že :D ;D
nesmíš namě ale říct že eště nespim :O :O :D ;D
kuli tomu kolik je hodin si to jako určitě musíš pořádně zkontrolovat protože sotva udržim voči votevřený teďko už :O :O :D ;D pustit to ale de a asi to i jako funguje si myslim :D
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
// fakt jako maj bejt ty data voddělený vod těch položek??????? :O :O
typedef struct
{
int id;
char * name;
}
Object;
typedef struct PolozkaSeznamu PolozkaSeznamu;
struct PolozkaSeznamu
{
Object data;
struct PolozkaSeznamu * next;
};
typedef struct
{
PolozkaSeznamu * first;
// k čemu jako potřebujem v dopředným seznamu pološku last když
// ji jakoby žádná z těch funkcí nepoužívá nanic?? :O :O
//PolozkaSeznamu * last;
}
Seznam;
/**
* Inicializace seznamu. Vytvori prazdny seznam.
*/
Seznam * list_ctor()
{
Seznam * sznm = malloc(sizeof(Seznam));
sznm->first = NULL;
return sznm;
}
PolozkaSeznamu * novaPolozka(Object data)
{
PolozkaSeznamu * p = malloc(sizeof(PolozkaSeznamu));
p->data = data;
p->next = NULL;
return p;
}
/**
* Vlozi polozku na zacatek seznamu.
*/
void list_insert_first(Seznam * sznm, PolozkaSeznamu * polozka)
{
//nejdřiv si zapamatujem první položku v seznamu protože ji jakoby přepišem novou první
//ale tu starou potřebujem aby jsme ji napojili zatu první
PolozkaSeznamu * puvodniPrvni = sznm->first;
// přepišem první položku novou skovanou v proměný 'polozka'
sznm->first = polozka;
// celou tu nudli položek/uzlů celýho seznamu/grafu teďko musíme zase připojit
// známe uzlík kterým ta šňurka má pokračovat ==> toje ta původní první položka seznamu
// nóó tak ji napojíme jako příští uzel naši nový první položky :O ;D
polozka->next = puvodniPrvni;
// nebo taky mužem přidat ukazatelem v tom poli takle Ňejak
// sznm->first->next = puvodniPrvni
// pracujem se stejnou věcí furt
}
/**
* Vrati true, pokud je seznam prazdny.
*/
bool isEmpty(Seznam * sznm)
{
// budem předpokládat že ten seznam je prázdnej když nemá žádnou první položku
// noa první položku nemá když ukazatel 'first' kouká nikam jakože teda na NULL
if(sznm->first == NULL)
return true;
else
return false;
//celý todleto mužem frajersky přepsat jako
//return sznm->first;
}
/**
* Odstrani prvni prvek seznamu, pokud je.
*/
void list_delete_first(Seznam * sznm)
{
//kdybysme rovnou jentak dali dopryč první položku tak by se nám seznam rozbil :O :O
// musíme si skovat druhou položku seznamu atu pak strčit misto ty první
// kterou jakoby chcem vodstranit
PolozkaSeznamu * prvni = sznm->first;
PolozkaSeznamu * druha = prvni->next;
//uvolníme paměť první položky
// skoro uplně ždycky když někde děláme 'malloc' tak taky jakoby pak musíme někde dělat 'free'
free(prvni);
//jako novou první položku seznamu nastavíme druhou
sznm->first = druha;
}
/**
* Vrati pocet polozek seznamu.
*/
unsigned int list_count(Seznam * sznm)
{
//spočítáme kolik máme položek v seznamu
// uděláme si nějakou počítací proměnou která bude začínat na nule
// a pudem seznamem vod první po poslední položku a za kažnou naštívenou položku
// počítací proměnou inkrementujeme/zvíšíme o jedničku
// nóó a to se jakoby po nás v týdletý funkci chce :D ;D
//začínáme první položkou celýho seznamu
// kdyby náááhodou byl seznam nazačátku prázdnej tak nám stejně tendleten argolytmus udělá že vrátí 0
PolozkaSeznamu * pristiPolozka = sznm->first;
// naše počítací proměná
unsigned int kolik = 0;
// todleto si měl dobře :D
// děláme dokuď proměná 'příštíPoložka' neni null/jeji adresa je věčí od nuly takže jakoby 'true'
while(pristiPolozka)
{
// zvednem počítací proměnou o 1 a jako příští položku nastavíme nóóóóóóó
// příští položku příští položky :D :D :D ;D
kolik++;
pristiPolozka = pristiPolozka->next;
}
//vrátíme kolik sme napočítali
return kolik;
}
/**
* Najde polozku seznamu s nejmensim identifikatorem. Vraci NULL, pokud je
* seznam prazdny.
*/
PolozkaSeznamu *list_find_minid(Seznam * sznm)
{
//podobně jako v předchozí funkci budem procházet seznam položku popoložce
// akorátže budem mit navíc jednu proměnou typu 'PoložkaSeznamu' noa do ní si budeme skovávat položku s nejvíc nejmenším id vobsaženýho oběktu ;D
PolozkaSeznamu * pristiPolozka = sznm->first;
//sem si budeme strkat tu položku s nejvíc nejmenším id oběktu
// zatim si tam dáme tu uplně první naštívenou
PolozkaSeznamu * nalezenaPolozka = sznm->first;
while(pristiPolozka)
{
//pokuď id právě našívený položky je menčí než id zatim nalezený položky
// tak si ji uložíme misto tý nalezený
if(pristiPolozka->data.id < nalezenaPolozka->data.id)
nalezenaPolozka = pristiPolozka;
pristiPolozka = pristiPolozka->next;
}
//nakonec vrátíme ukazatel natu nalezenou položku seznamu
return nalezenaPolozka;
}
/**
* Najde polozku seznamu s odpovidajicim jmenem objektu. Vraci NULL, pokud
* takova polozka v seznamu neni.
*/
PolozkaSeznamu *list_find_name(Seznam * sznm, char *name)
{
// jeto zase uplně stejný jako předtim akorátže nebudem hledat nejmenčí id
// ale první výskyt položky který data.name bude stejný
PolozkaSeznamu * pristiPolozka = sznm->first;
while(pristiPolozka)
{
// použijem funkci strcmp z knihovny string.h na dělání porovnání stringů
// (vrací 0 když sou voba stringy stejný) noa když se ména schodujou tak
// položku vrátíme
if( strcmp(name, pristiPolozka->data.name) == 0)
return pristiPolozka;
pristiPolozka = pristiPolozka->next;
}
// pokuď sme došli až sem nóó tak asi jako hledaná položka v seznamu neni
// a podle zadání musíme vrátit null
return NULL;
}
/**
* Uvolneni seznamu.
*/
void list_dtor(Seznam * sznm)
{
//projdem seznam a uděláme že vodstraníme všechny ty položky vobsažený
// furt jeto všecko stejný
PolozkaSeznamu * pristiPolozka = sznm->first;
while(pristiPolozka)
{
//skováme si adresu současný oložky než ji přepišem příští
PolozkaSeznamu * soucasna = pristiPolozka;
pristiPolozka = pristiPolozka->next;
//a tu současnou teďko uvolníme z paměti
free(soucasna);
}
sznm->first = NULL;
}
int main()
{
printf("list_ctor...\n");
Seznam * sznm = list_ctor();
printf("list_empty...\n");
printf("Seznam prazdny: %s\n", isEmpty(sznm) ? "ano" : "ne");
PolozkaSeznamu *item;
Object o1 = {42, "Honza"};
printf("item_ctor...\n");
item = novaPolozka(o1);
printf("list_insert_first...\n");
list_insert_first(sznm, item);
printf("Seznam prazdny: %s\n", isEmpty(sznm) ? "ano" : "ne");
printf("list_count...\n");
printf("Pocet prvku v seznamu: %d\n", list_count(sznm));
Object o2 = {2, "Malem"};
item = novaPolozka(o2);
printf("list_insert_first...\n");
list_insert_first(sznm, item);
Object o3 = {0, "Kralem"};
item = novaPolozka(o3);
printf("list_insert_first...\n");
list_insert_first(sznm, item);
printf("Pocet prvku v seznamu: %d\n", list_count(sznm));
printf("Odstraneni prvniho prvku ze seznamu \n");
list_delete_first(sznm);
printf("Pocet prvku v seznamu: %d\n", list_count(sznm));
// opetovne vlozeni objektu o1
item = novaPolozka(o1);
printf("list_insert_first...\n");
list_insert_first(sznm, item);
printf("list_find_minid...\n");
item = list_find_minid(sznm);
if (item != NULL) {
printf("Polozka s nejmensim identifikatorem: {%d, \"%s\"}\n",
item->data.id, item->data.name);
}
else
printf("Polozka s nejmensim identifikatorem nenalezena\n");
printf("list_find_name...\n");
char* name = "Honza";
item = list_find_name(sznm, name);
if (item != NULL) {
printf("Polozka s daty %s nalezena\n", name);
}
else
printf("Polozka s daty %s nenalezena.\n",name);
printf("list_dtor...\n");
list_dtor(sznm);
printf("Seznam prazdny: %s\n", isEmpty(sznm) ? "ano" : "ne");
return 0;
}
ttssssssssssssssssss zato jako muže učitelskej že nám dal blbou testovací funkci main by sme nato jako mohli ve tři ráno nějak po spuštění hnedka přijít :O :/ :D ;D
v zadání seto po nás chce aby seto jako hlídalo vtý samotný fci todleto takže máš pravdu :D ;D je tam teda potřeba připsat hlídací řádeček na prázdnej list/seznam malej a pak to snad bude uplně dobrý :O :O
takle třeba ta funkce
.
.
.
void list_delete_first(Seznam * sznm)
{
// pokud je první položka null tak nebudem nic vodstraňovat a vrátíme se z funkce/přerušíme ji
if(sznm->first == NULL)return;
// nebo takle
// if(!sznm->first)return;
PolozkaSeznamu * prvni = sznm->first;
PolozkaSeznamu * druha = prvni->next;
free(prvni);
sznm->first = druha;
}
.
.
.
učitelskej línej jeto pořádně naučit a bude jako googlit svý zadání pocelým internetu jóóó?? :O :O :D :D ;D ;D
asi natom stim googlením jako něco bude hele :O :D :D ;D
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.