Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

C: dinamičko proširivanje liste pointera...

[es] :: C/C++ programiranje :: C: dinamičko proširivanje liste pointera...

[ Pregleda: 2400 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

pajac
Slovenija

Član broj: 17163
Poruke: 66
*.dsl.siol.net.



Profil

icon C: dinamičko proširivanje liste pointera...16.05.2005. u 11:39 - pre 230 meseci
Zapeo sam na "malom" problemčiču oko liste pointera!
Nije mi bas jasno kako to funkcionira, pa da napravimo jedan jednostavan primer!

U listi pointera, bi volio imat cele brojeve (int).

Code:


struct lista{
    int broj;
    struct lista *next;  //to bi bila veza do sledečeg elementa u listi
};

int main(void){

    int i;
    int poljeInt[]={2,4,3,5,3};  //5-elemenata
    struct lista *p;   //to bi bila nasa lista

    for(i=0; i<5; i++){
        p = dodaj(poljeInt[i]);  //funkcija za pravljenje polja <--- TU DOĐE PROBLEM!
    }//for
    
    izpis(p);

    return 0;
}//end main()

struct lista *dodaj(int broj){
    /* e ovde mi taj mehanizam bas nije jasan!! */
    /* ako bi mi mogao neko malo objasnit to    */
    /* Evo resenje,koje ne radi!!                       */
    struct lista *k;
    struct lista *p;
    
    if((k=malloc(st))!=NULL){
        k->broj = st;  //upisujemo broj
        k->next = p;
    }//if
    
    return p;
}//end dodaj()

void izpis(struct seznam *p){
    
    if(p!=NULL){
        printf("%d",p->broj);
        while((p=p->next)!=NULL)
            printf(", %d",p->broj);
    }//if
}//izpis


Sad je očito da ne razmišljam pravim putem, tako da bi svaki hint dobro došao!
Još jednom, ovo rešenje ne radi!!:(
Voleo bi samo pokapirat tu logiku, ako ima neko minut vremena?

If we want to discover, we first have to be willing to get lost!
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.ptt.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: C: dinamičko proširivanje liste pointera...16.05.2005. u 12:45 - pre 230 meseci
Net je prepun takvih primera. Na primer kucaj u Google:

c "struct list" next node

Za početak pogledaj:

http://www.mpipks-dresden.mpg.de/~goerke/C/090800.html
http://www.math.ntnu.no/~bardsk/uv/c-kurs/2002h/del_2-3.pdf
http://www.codecomments.com/C/message489300-5.html

... i još 1000 sličnih ;)

Ako se ne snadjes onda cu (cemo) ti pomoci, mada je na netu sigurno dobro
objasnjeno...
 
Odgovor na temu

dragansm
Dragan Smiljanic

Član broj: 38170
Poruke: 191
*.nat-pool.bgd.sbb.co.yu.



Profil

icon Re: C: dinamičko proširivanje liste pointera...16.05.2005. u 20:03 - pre 230 meseci
Blago imas gresku u pravcu razmisljanja :)
Da bi lista radila na nacin kako si poceo da je pises, mora da postoji pokazivac na pocetak liste, tako da pri svakom dodavanju (osim prvog dodavanja u praznu listu) prolazis (iteriras) kroz elemente liste trazeci poslednji (kad next polje ima vrednost kraja liste -- najcesce NULL).
Ukoliko ti treba lista za nesto konkretno predlazem da upotrebis STL biblioteku na nacin:

Code:

#include <list>

using namespace std;

list<int> myList;
for ( int i = 0; i < 5; ++i ) myList.push_back( i );
list<int>::iterator iter = myList.begin();
while ( iter != myList.end() )
{
printf( "%d ", *iter );
}


Ukoliko ti je pravljenje liste edukativnog karaktera, tvoj kod moze da izgleda ovako:

Code:



struct lista{
    int broj;
    lista *next;  //to bi bila veza do sledečeg elementa u listi
};

int main(void){
    int poljeInt[]={2,4,3,5,3};  //5-elemenata
    lista *p = 0;   //to bi bila nasa lista
    for(int i=0; i<5; i++){
        if ( !p ) p = dodaj(poljeInt[i]);
        else
        {
           lista *k = p->next;  // k je iterator kroz listu
           while ( k->next ) k = k->next;  // potrazi pokazivac na poslednji element liste
           k->next = dodaj(poljeInt[i]); // dodaj element na kraj liste
        }
    }
    
    izpis(p);

    return 0;
}//end main()

struct lista *dodaj(int broj){
    // napravi mesta za novi clan liste
    lista *k = malloc(sizeof(lista)) // alocira 8 bajtova 2 za pokazivac, 2 za int
    if (k) { // da li je bilo dovoljno mesta u memoriji
        k->broj = broj;  //upisujemo broj
        k->next = 0; // ja sam poslednji
    }
    return k;
}//end dodaj()

void izpis(lista *p){
    while (p)
    {
        printf("%d", p->broj); 
        p = p->next;
        if ( p ) printf (", "); // ako bas treba zapetica
    }
}//izpis 
 
Odgovor na temu

pajac
Slovenija

Član broj: 17163
Poruke: 66
*.dsl.siol.net.



Profil

icon Re: C: dinamičko proširivanje liste pointera...19.05.2005. u 20:45 - pre 230 meseci
Najpre hvala vam na pomoči, da ne mislite da sam zaboravio na post! ;)
Vec dva dana se zezam oko tih pointera.

Malo sam promenio gornji kod, zato sto nije radio.Ali opet nastaje problem posto dobijem izpis iz samo zadnja dva broja?! A GDE JE REFERENCA NA POČETAK?

Evo koda:
Code:

struct lista {
    int broj;
    struct lista *next;  //to bi bila veza do sledečeg elementa u listi
};

struct lista *dodaj(int broj);
void izpis(struct lista *p);

int main(void){
    
    int poljeInt[]={2,4,3,5,3};  //5-elemenata
    struct lista *p = 0;   //to bi bila nasa lista
    int i=0;
    
    for(i=0; i<5; i++){
       if (!p)
            p = dodaj(poljeInt[i]);
        else
        {
            while ( p->next ) 
                p = p->next;  // potrazi pokazivac na poslednji element liste
            p->next = dodaj(poljeInt[i]); // dodaj element na kraj liste
        }//else
    }//for
    
    izpis(p);

    return 0;
}//end main()

struct lista *dodaj(int broj){
    // napravi mesta za novi clan liste
    struct lista *k = malloc(sizeof(struct lista)); // alocira 8 bajtova 2 za pokazivac, 2 za int
    if (k) { // da li je bilo dovoljno mesta u memoriji
        k->broj = broj;  //upisujemo broj
        k->next = 0; // ja sam poslednji
    }
    return k;
}//end dodaj()

void izpis(struct lista *p){
    
    while (p)
    {
        printf("\n%d", p->broj); 
        if (p=p->next)
            printf ("\n"); // ako bas treba zapetica
    }//while
}//izpis 




If we want to discover, we first have to be willing to get lost!
 
Odgovor na temu

dragansm
Dragan Smiljanic

Član broj: 38170
Poruke: 191
*.nat-pool.bgd.sbb.co.yu.



Profil

icon Re: C: dinamičko proširivanje liste pointera...20.05.2005. u 09:28 - pre 230 meseci
Code:

struct lista {
    int broj;
    struct lista *next;  //to bi bila veza do sledečeg elementa u listi
};

struct lista *dodaj(int broj);
void izpis(struct lista *p);

int main(void){
    
    int poljeInt[]={2,4,3,5,3};  //5-elemenata
    struct lista *p = 0;   //to bi bila nasa lista
    // NEW:
    struct lista *pocetakListe = 0;
    int i=0;
    
    for(i=0; i<5; i++){
        if (!p)
        // NEW:
        {
            // NEW:
            pocetakListe = p = dodaj(poljeInt[i]);
        // NEW:
        }
        else
        {
            while ( p->next ) 
                p = p->next;  // potrazi pokazivac na poslednji element liste
            p->next = dodaj(poljeInt[i]); // dodaj element na kraj liste
        }//else
    }//for
    
    // NEW:
    izpis(pocetakListe);

    return 0;
}//end main()

struct lista *dodaj(int broj){
    // napravi mesta za novi clan liste
    struct lista *k = malloc(sizeof(struct lista)); // alocira 8 bajtova 2 za pokazivac, 2 za int
    if (k) { // da li je bilo dovoljno mesta u memoriji
        k->broj = broj;  //upisujemo broj
        k->next = 0; // ja sam poslednji
    }
    return k;
}//end dodaj()

void izpis(struct lista *p){
    
    while (p)
    {
        printf("\n%d", p->broj); 
        if (p=p->next)
            printf ("\n"); // ako bas treba zapetica
    }//while
}//izpis 



Pocetak liste je upisan u pokazivac pocetakListe. Dodaj delove ispod // NEW: i trebalo bi da radi..
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.ptt.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: C: dinamičko proširivanje liste pointera...20.05.2005. u 10:03 - pre 230 meseci
Da, mislim da bi sada trebalo da radi... U prvom primeru, koliko sam primetio
(uglavnom) se bio "izgubio" pokazivač na početak liste, pa se i nije znalo odakle
da započne ispis.
 
Odgovor na temu

pajac
Slovenija

Član broj: 17163
Poruke: 66
*.dsl.siol.net.



Profil

icon Re: C: dinamičko proširivanje liste pointera...24.05.2005. u 12:48 - pre 230 meseci
Da radi, hvala Vama svima, stvarno ste mi pomogli!!
Nisam se javljo neko vreme pošto sam programiro neke zadače u javi pa sam visio na Sun-ovom Java forumu!!
Evo sve je reseno juče. Trebalo mi celih 6min za 7zadača (3C + 4Java).
Još čemo se čut i HVALA Vam još jednom!!
If we want to discover, we first have to be willing to get lost!
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
*.fsb.hr.



+9 Profil

icon Re: C: dinamičko proširivanje liste pointera...31.05.2005. u 15:15 - pre 229 meseci
Nije mi jos jasno na kakvu si listu mislio. Organizacija po strukturi STOG-a ili RED-a?
Inace, u funkciji kojoj predajes element listi trebas imati pokazivac na pocetak te liste. Tada taj pokazivac predas funkciji (njegovu adresu):

dodaj(struct zapis** glava, struct zapis* element);

Ostalo je stvar realizacije strukture po kojoj je oblikovana lista. Inace, ovo sve imas jako dobro objasnjeno u knjizi

C++ ANALIZA I PRIMJENA, Zeljko Kovacevic, Skolska knjiga, Zagreb, 2004.g

Inace, lista moze biti visestruka, automatski realizirana da se novi element koji se dodaje odmah dinamicki alocira i sortira po odabranom kriteriju. Tu su i dvosmjerne liste i visestruko povezane... Danas se to sve radi preko klasa upotrebom inkapsulacije itd...
 
Odgovor na temu

[es] :: C/C++ programiranje :: C: dinamičko proširivanje liste pointera...

[ Pregleda: 2400 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.