[ dontoo @ 22.03.2010. 12:33 ] @
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]
[ dontoo @ 22.03.2010. 13:02 ] @
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
}
[ dontoo @ 22.03.2010. 13:21 ] @
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;
}
[ Wajda.W @ 22.03.2010. 16:07 ] @
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;
    
}
[ dontoo @ 22.03.2010. 17:08 ] @
Kužim, mnogo je ljepše.
[ Wajda.W @ 22.03.2010. 17:27 ] @
Samo mi nije jasno sta bi onda trebala f-ja Insert() da radi ako vec imas ove dve f-je?
[ dontoo @ 23.03.2010. 10:57 ] @
Insert između nekog elementa
[ Wajda.W @ 23.03.2010. 14:42 ] @
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.