C - zoznamy

Programovacie jazyky, rady, poradňa...
ultimate222
Light Star
Light Star
Príspevky: 263
Registrovaný: 10 júl 2011, 14:17
Bydlisko: Zvolen

C - zoznamy

Príspevok od používateľa ultimate222 »

Neviete o nejakej dobrej literature (dostupnej na nete by bolo naj) odkial sa da naucit o zoznamoch v c-ku prepajanych smernikmi ?

nieco kde to je dobre, polopatisticky vysvetlene
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Re: C - zoznamy

Príspevok od používateľa reDo »

Kód: Vybrať všetko

struct Uzol
{
    int hodnota; // miesto pre data
    Uzol * dalsi; // pointer na dalsi
};
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: C - zoznamy

Príspevok od používateľa audiotrack »

a v prípade obojsmerného (cyklického) zoznamu tam budú dva ukazatele. Hotovo, zvyšných 300 strán v tvojej pomyselnej literatúre bude len zbytočný obkec :)
ultimate222
Light Star
Light Star
Príspevky: 263
Registrovaný: 10 júl 2011, 14:17
Bydlisko: Zvolen

Re: C - zoznamy

Príspevok od používateľa ultimate222 »

a ako sa potom zapisuje do toho zoznamu ? Ako vlozim nejake hodnoty do jednotlivych "poloziek" ?

Uzol.hodnota = 5;

a potom do dalsieho uzla ako vlozim hodnotu ?
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: C - zoznamy

Príspevok od používateľa audiotrack »

Uzol->dalsi->hodnota = 5;
ultimate222
Light Star
Light Star
Príspevky: 263
Registrovaný: 10 júl 2011, 14:17
Bydlisko: Zvolen

Re: C - zoznamy

Príspevok od používateľa ultimate222 »

a aky je v tom rozdiel ked sa to robi takto?

Kód: Vybrať všetko

struct node* head = NULL;
struct node* second = NULL;

head = malloc(sizeof(struct node));
second = malloc(sizeof(struct node));

head->data = 1;
head->next = second;
s tymi sipkami myslim
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: C - zoznamy

Príspevok od používateľa audiotrack »

(*ukazatel).hodnota = 20;
ukazatel->hodnota = 20;

tieto dva zápisy sú ekvivalentné. Šípka zdereferencuje rovnako ako hviezdička, je to len krajší spôsob zápisu
ultimate222
Light Star
Light Star
Príspevky: 263
Registrovaný: 10 júl 2011, 14:17
Bydlisko: Zvolen

Re: C - zoznamy

Príspevok od používateľa ultimate222 »

aha, diky ... takze kebyze mam tu strukturu Uzol ktoru sem postol reDo, tak by som do zoznamu zapisoval prvky takto?

dalsi->hodnota = 20;
a potom do nasledujuceho uzla zase dalsi->hodnota = 30; ? .. ze napriklad v nejakom cykle by som to robil a takto by sa zapisali hodnoty do celeho zoznamu ?
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: C - zoznamy

Príspevok od používateľa audiotrack »

a prečo tieto teoretické otázky? Skús a uvidíš ;) Lepšie si to tak zapamätáš ako keď ti odpoviem že áno
ultimate222
Light Star
Light Star
Príspevky: 263
Registrovaný: 10 júl 2011, 14:17
Bydlisko: Zvolen

Re: C - zoznamy

Príspevok od používateľa ultimate222 »

Mam teraz takyto kod na zoznam ... simulacia Stack-u, cize mozem vkladat a vyberat len posledny prvok

Kód: Vybrať všetko

 #include "stackl.h"
        #include "fatal.h"
        #include <stdlib.h>

        struct Node
        {
            TElement Element;
            PtrToNode   Next;
        };

        int
        IsEmpty( Stack S )
        {
            return S->Next == NULL;
        }

        Stack
        CreateStack( void )
        {
            Stack S;

            S = malloc( sizeof( struct Node ) );
            if( S == NULL )
                FatalError( "Out of space!!!" );
            S->Next = NULL;
            MakeEmpty( S );
            return S;
        }

        void
        MakeEmpty( Stack S )
        {
            if( S == NULL )
                Error( "Must use CreateStack first" );
            else
                while( !IsEmpty( S ) )
                    Pop( S );
        }

        void
        DisposeStack( Stack S )
        {
            MakeEmpty( S );
            free( S );
        }

        TElement
        Top( Stack S )
        {
            if( !IsEmpty( S ) )
                return S->Next->Element;
            Error( "Empty stack" );
            return 0;  /* Return value used to avoid warning */
        }

        void
        Pop( Stack S )
        {
            PtrToNode FirstCell;

            if( IsEmpty( S ) )
                Error( "Empty stack" );
            else
            {
                FirstCell = S->Next;
                S->Next = S->Next->Next;
                free( FirstCell );
            }
        }
Pop vybera prvok a treba mi spravit funkciu Push, ktora vlozi prvok za posledny prvok, skusal som nejak takto ale nejde to, ako by to malo byt ?
prototyp musi byt: Push( TElement X, Stack S )

Kód: Vybrať všetko

void
        Push( TElement X, Stack S )
        {
           if(IsEmpty(S)) S->Next->Element = X;
             else
           S->Next->Next->Element = X;

        }
Napísať odpoveď