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

vezane liste- zapeo sam

[es] :: C/C++ programiranje :: C/C++ za početnike :: vezane liste- zapeo sam

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

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

dontoo

Član broj: 249815
Poruke: 40
*.adsl.net.t-com.hr.



+1 Profil

icon vezane liste- zapeo sam22.03.2010. u 12:33 - pre 171 meseci
Program mora imati funkcije Dodaj_na_pocetak_liste i Dodaj_na_kraj_liste. Također mogu korstiti samo jednu strukturu za listu ( dakle prenosim dvostruke pointere ). Sad napisao sam obe funkcije i obe funkcije rade zasebno. Stvar je u tome da kad koristim jednu pa drugu funkciju tijekom izvođenja programa one pobrkaju varijable. U komentarima koda je dano objašnjenje. Problem pravi krivo inicijalizirana *prev varijabla.
Code:

#include <stdio.h>
#include <stdlib.h>

struct Data
{
    int x;
    int y;
    struct Data * next;
};

void AddBeginning ( Data **, Data **, Data ** );
void AddEnd ( Data **, Data **, Data ** );
void Insert ();
void Remove ();
void ShowList ( Data ** );
void Search ();



int main ( void )
{
    int menu = 0;
    struct Data * head, * prev, * current;
    head = NULL;
    while ( menu != 7 )
    {
        printf ( "Add at beginning - 1\nAdd at end- 2\nInsert - 3\nRemove - 4\nSearch - 5\nShow - 6\nEnd Program - 7\n" );
        scanf ( "%d", &menu );
        switch ( menu )
        {
        case 1:
            AddBeginning ( &head, &prev, &current );
            break;
        case 2:
            AddEnd ( &head, &prev, &current );
            break;
        case 3:
            break;
        case 4:
            break;
        case 5:
            break;
        case 6:
            ShowList ( &head );
            break;
        default:
            break;
        }
    }
    return 0;
}

void AddBeginning ( struct Data ** head, struct Data ** prev, struct Data ** current )
{
    * current = ( struct Data * )malloc ( sizeof ( struct  Data  ) );
    scanf ( "%d", &(* current )->x );
    scanf ( "%d", &(* current )->y );
    if ( * head == NULL )            //Ako je već pozvana funkcija AddEnd tada head nije NULL
    {    
        * head = * current;
        (* current)->next = NULL;
    }
    else
    {    
        * head = *current;
        (* head)->next = * prev; //To pravi problem ovdje jer * prev nije inicijaliziran na * head
    }
    * prev = * head;   //Kako ova funkcija nikada nije izvedena ni *prev nije incijaliziran na *head
    
}

void AddEnd ( struct Data ** head, struct Data ** prev, struct Data ** current )
{
    * current = ( struct Data * )malloc ( sizeof ( struct  Data  ) );
    scanf ( "%d", &(* current )->x );
    scanf ( "%d", &(* current )->y );
    if ( * head == NULL ) //Head nije NULL ako je već pozvan funkcija AddBeginning
        * head = * current;
    else
        (* prev )->next = *current; //Ista stvar ovdje, ako je pozvan funkcija AddBeginning tada * prev nije inicijaliziran na * current
    (* current )->next = NULL;
    * prev = * current;
}

void ShowList ( struct Data ** head )
{
    struct Data * current;
    current = *head;
    while ( current != NULL )
    {
        printf ( "x = %d y = %d\n", current->x, current->y );
        current = current->next;
    }
}



[Ovu poruku je menjao dontoo dana 22.03.2010. u 13:45 GMT+1]
 
Odgovor na temu

dontoo

Član broj: 249815
Poruke: 40
*.adsl.net.t-com.hr.



+1 Profil

icon Re: vezane liste- zapeo sam22.03.2010. u 13:02 - pre 171 meseci
Smislio sa nešto za jednu funkciju, ali ne znam za drugu. Dodao sam varijablu tail, ali ne znam kako da pamtim zadnji element
Code:
void AddBeginning ( struct Data ** head, struct Data ** tail, struct Data ** prev, struct Data ** current )
{
    * current = ( struct Data * )malloc ( sizeof ( struct  Data  ) );
    scanf ( "%d", &(* current )->x );
    scanf ( "%d", &(* current )->y );
    if ( * head == NULL )        
    {    
        * head = * current;
        (* current)->next = NULL;
    }
    else
    {    
        * head = *current;
        (* head)->next = * prev; 
    }
    * prev = * head;
    *tail =                                        //  To moram zapamtiti zadnji element
    
}

void AddEnd ( struct Data ** head,  struct Data ** tail, struct Data ** prev, struct Data ** current )
{
    * current = ( struct Data * )malloc ( sizeof ( struct  Data  ) );
    scanf ( "%d", &(* current )->x );
    scanf ( "%d", &(* current )->y );
    if ( * head == NULL ) 
        * head = * current;
    else
        (* tail )->next = *current; 
    (* current )->next = NULL;
    * tail = * current;
    * prev = * head;              //   Pamti head varijablu
}
 
Odgovor na temu

dontoo

Član broj: 249815
Poruke: 40
*.adsl.net.t-com.hr.



+1 Profil

icon Re: vezane liste- zapeo sam22.03.2010. u 13:21 - pre 171 meseci
Uspio sam smisliti. Mislim da je na forum već bilo vezanih lista sa dvostrukim pointerima, pa ako netko zna link topica neka napiše. Zanima me kako su to drugi riješili. Htio bi to riješit školski.
Code:
void AddBeginning ( struct Data ** head, struct Data ** tail, struct Data ** prev, struct Data ** current )
{
    * current = ( struct Data * )malloc ( sizeof ( struct  Data  ) );
    scanf ( "%d", &(* current )->x );
    scanf ( "%d", &(* current )->y );
    if ( * head == NULL )        
    {    
        * head = * current;
        (* current)->next = NULL;
        *tail = *head;
    }
    else
    {    
        * head = *current;
        (* head)->next = * prev; 
    }
    * prev = * head;
    
}

void AddEnd ( struct Data ** head,  struct Data ** tail, struct Data ** prev, struct Data ** current )
{
    * current = ( struct Data * )malloc ( sizeof ( struct  Data  ) );
    scanf ( "%d", &(* current )->x );
    scanf ( "%d", &(* current )->y );
    if ( * head == NULL ) 
        * head = * current;
    else
        (* tail )->next = *current; 
    (* current )->next = NULL;
    * tail = * current;
    * prev = * head;
}
 
Odgovor na temu

Wajda.W
Vladimir Vajda
Zrenjanin

Član broj: 127039
Poruke: 323
*.dynamic.isp.telekom.rs.



+101 Profil

icon Re: vezane liste- zapeo sam22.03.2010. u 16:07 - pre 171 meseci
Cek, je l' ti treba da pravis vezanu listu koja je vezana u oba smera (sa dva pokazivaca), ili koja je vezana samo u jednom smeru, s jednim pokazivacem?
Code:

* current = ( struct Data * )malloc ( sizeof ( struct  Data  ) );


ne treba ti ovde dereferencirani pokazivac kada dodeljujes memorijski prostor, nego samo pokazivac

Code:

current = ( struct Data * )malloc ( sizeof ( struct  Data  ) );


ja bih ovako to zapisao:

Code:

//void AddBeginning ( struct Data ** head, struct Data ** tail, struct Data ** prev, struct Data ** current ) 
 //ne treba ti toliko podataka o  listi za dodavanje na pocetak, current necemo dirati, on ce da pokazuje tamo gde je i pokazivao

void AddBeginning ( struct Data ** head, struct Data ** tail)
{
    struct Data *new;  // neka lokalna promenljiva koja ce pamtiti novokreirani element dok se on ne doda u listu
    new = (struct Data*) malloc(sizeof(struct  Data));
    scanf ( "%d", &a);
    scanf ( "%d", &b);
    new->x = a;
    new->y = b;
    if (head == NULL)        
    {    
        head = new;
        new->next = NULL;
        tail = head;
    }
    else
    {
        new->next = head;
        head = new;

        //head = *current;              ovako samo komplikujes sa prev
        //(* head)->next = * prev;    
    }
    
}

void AddEnd ( struct Data ** head,  struct Data ** tail)  // takodje current i prev necemo dirati, oni treba da su tamo gde su bili, npr negde na sredini liste
{
    struct Data *new;  // neka lokalna promenljiva koja ce pamtiti novokreirani element dok se on ne doda u listu
    new = (struct Data*) malloc(sizeof(struct  Data));
    scanf ( "%d", &a);
    scanf ( "%d", &b);
    new->x = a;
    new->y = b;

    if (head == NULL) 
        head = tail = new;
    else
        tail->next = new; 
    new->next = NULL;
    
}
 
Odgovor na temu

dontoo

Član broj: 249815
Poruke: 40
*.adsl.net.t-com.hr.



+1 Profil

icon Re: vezane liste- zapeo sam22.03.2010. u 17:08 - pre 171 meseci
Kužim, mnogo je ljepše.
 
Odgovor na temu

Wajda.W
Vladimir Vajda
Zrenjanin

Član broj: 127039
Poruke: 323
*.dynamic.isp.telekom.rs.



+101 Profil

icon Re: vezane liste- zapeo sam22.03.2010. u 17:27 - pre 171 meseci
Samo mi nije jasno sta bi onda trebala f-ja Insert() da radi ako vec imas ove dve f-je?
 
Odgovor na temu

dontoo

Član broj: 249815
Poruke: 40
*.adsl.net.t-com.hr.



+1 Profil

icon Re: vezane liste- zapeo sam23.03.2010. u 10:57 - pre 171 meseci
Insert između nekog elementa
 
Odgovor na temu

Wajda.W
Vladimir Vajda
Zrenjanin

Član broj: 127039
Poruke: 323
*.dynamic.isp.telekom.rs.



+101 Profil

icon Re: vezane liste- zapeo sam23.03.2010. u 14:42 - pre 171 meseci
Obicno imas kod listi ove opcije.
Da ubacis na pocetak, na kraj liste, pre tekuceg elementa i posle tekuceg elementa.
Onda jos imas obrisi pocetni, pobrisi krajnji, obrisi tekuci, obrisi listu.
Onda za pozicioniranje, na pocetak, na kraj, sledeci, prethodni.
I za proveru da li je kraj ili da li je pocetak npr je_kraj() i je_pocetak()
I naravno za citanje vrednosti tekuceg.

Ne moraju sve ove f-je da postoje, a mogu i jos neke dodatne.
Ali reko da ti dam ideju.
Probaj da napravis listu i f-je tako da njom mozes komotno da rukujes samo preko tih f-ja, de ne moras da mislis da sta se
unutra desava.

p.s. Mozda sam malo preterao , ali to je otprilike neka funkcionalna celina, mislim da tim putem treba ici kad se uci, a i uopste.
Pozdrav, pomocicu rado ako negde zapne.
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: vezane liste- zapeo sam

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

Postavi temu Odgovori

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