Portál AbcLinuxu, 21. května 2025 04:46

Dotaz: Jazyk C JEDNOSMĚRNĚ VÁZANÝ SEZNAM

17.12.2020 19:53 Kajajaa
Jazyk C JEDNOSMĚRNĚ VÁZANÝ SEZNAM
Přečteno: 790×
Odpovědět | Admin
Příloha:

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:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Řešení 1× (Вherzet)
17.12.2020 21:06 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: Jazyk C JEDNOSMĚRNĚ VÁZANÝ SEZNAM
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pouzi pri programovani ceruzku a papier. Najprv to rob na papieri, ako sa robi s objektami zoznam a co obsahuje 1 prvok zoznamu, a az potom programuj.

Ak rozumies "Vrati pocet polozek seznamu.", tak potom ostatne by nemali byt problem.

list_empty() kedy vracia false? :D

list_ctor() je zle. A ma nieco vraciat a nevracia nic.

item_ctor() - premmena i radsej pouzi cely nazov a ne skratku. Premmena 'a', 'b', 'i' a 'j' sa zvyknu pouzivat na indexy pre polia (i ako index).

list_delete_first() je zle.

list_count() spravne. Ak to vies, tak vies odstranovat data, list_find_minid() a list_find_name(). Ved pracujes s prvkami zoznami (a pripadne Objektami v prvok zoznamu).

pridanie dat na zaciatok - ekvivalent v realnom zivote, co musim urobit ak chcem pridat novy knizku v kniznici?
debian.plus@protonmail.com
Gréta avatar 18.12.2020 03:10 Gréta | skóre: 37 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: Jazyk C JEDNOSMĚRNĚ VÁZANÝ SEZNAM

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

Gréta avatar 18.12.2020 03:01 Gréta | skóre: 37 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: Jazyk C JEDNOSMĚRNĚ VÁZANÝ SEZNAM
Odpovědět | | Sbalit | Link | Blokovat | Admin

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

Zelená energetická soustava založená na obnovitelnejch zdrojích energie versus realnej svět 🤡🇪🇸
Řešení 1× (Вherzet)
18.12.2020 11:58 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: Jazyk C JEDNOSMĚRNĚ VÁZANÝ SEZNAM
list_delete_first() je zle. Neosetrujes, ak je list prazdny. V tom pripade najskor dojde k segmentation fault.
debian.plus@protonmail.com
Gréta avatar 18.12.2020 15:28 Gréta | skóre: 37 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: Jazyk C JEDNOSMĚRNĚ VÁZANÝ SEZNAM

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

.
.
.
18.12.2020 18:02 Peter Golis | skóre: 64 | blog: Bežné záležitosti | Bratislava
Rozbalit Rozbalit vše Re: Jazyk C JEDNOSMĚRNĚ VÁZANÝ SEZNAM
On to tam dal z klasického dôvodu, aby mu to našiel Gogoľ keď bude na troch kráľov kontrolovať ktoré z detí si to nechalo vypracovať voľakde po internetoch.
Gréta avatar 18.12.2020 20:17 Gréta | skóre: 37 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: Jazyk C JEDNOSMĚRNĚ VÁZANÝ SEZNAM

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

18.12.2020 21:10 Peter Golis | skóre: 64 | blog: Bežné záležitosti | Bratislava
Rozbalit Rozbalit vše Re: Jazyk C JEDNOSMĚRNĚ VÁZANÝ SEZNAM
Kto tvrdí že nespal na výučbe, ten tam spí do teraz.
Gréta avatar 23.12.2020 13:46 Gréta | skóre: 37 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: Jazyk C JEDNOSMĚRNĚ VÁZANÝ SEZNAM

asi natom stim googlením jako něco bude hele :O :D :D ;D

23.12.2020 16:45 Peter Golis | skóre: 64 | blog: Bežné záležitosti | Bratislava
Rozbalit Rozbalit vše Re: Jazyk C JEDNOSMĚRNĚ VÁZANÝ SEZNAM
To sa deje odkedy zaviedli internet do škôl.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.