[ artriba @ 26.11.2007. 12:38 ] @
Imam 3 koda od kojih 2 rade a jedan neradi
Ovaj kod kreira i ispisuje listu od 10 elemenata tako da postavlja nove članove na početak i radi normalno
Code:
#include <stdio.h>
#include <stdlib.h>
struct list
{
    int value;
    struct list * next;
};
void main()
{
    struct list * head = NULL, *list_ptr;
    int i;
    //unosimo 5 elemenata
    for ( i = 0; i < 5; i++ )
    {
        list_ptr = (struct list*) malloc ( sizeof ( struct list ) );
        list_ptr->next = head;
        head = list_ptr;
        printf( "Ucitaj element liste:" );
        scanf( "%d", &list_ptr->value);
    }
    //ispisuemo listu
    while( list_ptr!= NULL)
    {
        printf( "%d\n", list_ptr-> value);
        list_ptr= list_ptr-> next;
    }
    //ponovno unosimo 5 elemenata
    for ( i = 0; i < 5; i++ )
    {
        list_ptr = (struct list*) malloc ( sizeof ( struct list ) );
        list_ptr->next = head;
        head = list_ptr;
        printf( "Ucitaj element liste:" );
        scanf( "%d", &list_ptr->value);
    }
    //ispisujemo listu sad preko heada
    while( head != NULL)
    {
        printf( "%d\n", head->value);
        head = head->next;
    }
}
ovaj kod radi istu stvar preko funkcija s tim da sam u main() alocirao novi čvor za head te i u funkciji novi čvor koji povezujem na head- kod radi
Code:
#include <stdio.h>
#include <stdlib.h>
void InsertOnBegean( struct list * );
void PrintLIst ( struct list * );

struct list
{
    int value;
    struct list * next;
};
void PrintList( struct list * head )
{
    struct list * actual;
    if( head->next )
    {
        printf ( "Lista: ");
        actual = head->next;
        do
        {
            printf( "%d ", actual->value );
            actual = actual->next;
        }
        while(actual);
    }
    else
    {
        printf ("Lista je prazna");
    }
    printf( "\n" );
}    
void InsertOnBegean( struct list * head )
{
    struct list * list_ptr;
    list_ptr = ( struct list * ) malloc ( sizeof ( struct list ) );
    printf( "Ucitaj element liste:" );
    scanf( "%d", &list_ptr->value );
    list_ptr->next = head->next;
    head->next = list_ptr;
}
void main()
{
    struct list *head = (struct list * ) malloc ( sizeof( struct list ) );
    head->next = NULL;
    int ch = 1;
    while ( ch != 3 )
    {
        printf ( "1 - input\n2 - list\n3 - end\n" );
        scanf( "%d", &ch );
        switch ( ch )
        {
        case 1:
            InsertOnBegean ( head );
            break;
        case 2:
            PrintList ( head );
            break;
        default :
            break;
        }
    }
}

kod ovog trećeg koda koji ne radi išao sam istom logikom kao kod prvog koda tako da inicijaliziram head na NULL te mu u funkciji dodam novi čvor s tim ako je head == NULL lista je prazna te dodajm prvi i jedini čvor. Nakon toga kod sledećeg poziva funkcije lista nije prazna i prelazimo na else. Meni uvek javlja da je lista prazna. Ne razumen zašto i u čemu je greška kad je ista logika programa kao kod prvog koda. Kako da napravim program bez da pravim novi čvor u mainu() i da mi ima provjeru ako je lista prazna dodaj prvi element, else ako lista ima elemenata postavi ga na početak. Objasnite mi također greške koje radim zašto prvi kod radi a treći ne.
Code:
#include <stdio.h>
#include <stdlib.h>
void InsertOnBegean( struct list * );
void PrintLIst ( struct list * );

struct list
{
    int value;
    struct list * next;
};
void PrintList(struct list *head)
{
    if ( head ) // ako je head true znaći da lista ima elementa
    {
        while ( head != NULL ) //dok head ne postane NULL
        {
            printf ( "%d", head->value ); //printaj head
            head = head->next; //kruži kroz listu
        }
    }
    else // uvijek pokazuje da je head NULL
    {
        printf ("Lista je prazna");
    }
    printf("\n");
}    
void InsertOnBegean( struct list * head )
{
    struct list * list_ptr;
    if ( head == NULL )//ako je head == NULL lista je prazna - uvijek pokazuje da je lista prazna nikako da dođe do else
    {
        printf ( "LISTA JE PRAZNA SAD CEMO DODATI PRVI CVOR\n" );
        list_ptr = (struct list * ) malloc ( sizeof( struct list ) ); //alocirali smo novi čvor
        printf("Ucitaj element liste:");
        scanf( "%d", &list_ptr->value );
        head = list_ptr; // headu smo dodali list_ptr koji ima jedan čvor
        head->next = NULL; //kraj liste samo jedan čvor
        free (list_ptr);
    }
    else //lista nije prazna dodat ce mo novi cvor na početak
    {
        printf ( "LISTA NIJE PRAZNA DODAJEMO NOVI ČVOR NA POČETAK\n" );
        list_ptr = (struct list * ) malloc ( sizeof( struct list ) ); //alocirali smo novi čvor
        printf("Ucitaj element liste:");
        scanf( "%d", &list_ptr->value );
        list_ptr->next = head->next; //spajamo list_ptr-<next sa head->next, kod prvog poziva "else" to će biti NULL
        head->next = list_ptr; //head->next ne pokazuje više na NULL već na list_ptr koji pokazuje na NULL - to vrijedi za prvi "else" poziv
        free ( list_ptr );
    }

}
void main()
{
    struct list * head = NULL;
    int ch = 1;
    while ( ch != 3 )
    {
        printf ( "1 - input\n2 - list\n3 - end\n" );
        scanf( "%d", &ch );
        switch ( ch )
        {
        case 1:
            InsertOnBegean ( head );
            break;
        case 2:
            PrintList ( head );
            break;
        default :
            break;
        }
    }
}
[ Burgos @ 26.11.2007. 13:01 ] @
Code:
#include <stdio.h>
#include <stdlib.h>
#define _CRT_SECURE_NO_DEPRECATE 1;
void InsertOnBegean( struct list ** );
void PrintLIst ( struct list * );

struct list
{
    int value;
    struct list * next;
};
void PrintList(struct list *head)
{
    if ( head ) // ako je head true znaći da lista ima elementa
    {
        while ( head != NULL ) //dok head ne postane NULL
        {
            printf ( "%d", head->value ); //printaj head
            head = head->next; //kruži kroz listu
        }
    }
    else // uvijek pokazuje da je head NULL
    {
        printf ("Lista je prazna");
    }
    printf("\n");
}    
void InsertOnBegean( struct list ** head )
{
    struct list * list_ptr;
    if ( *head == NULL )//ako je head == NULL lista je prazna - uvijek pokazuje da je lista prazna nikako da dođe do else
    {
        printf ( "LISTA JE PRAZNA SAD CEMO DODATI PRVI CVOR\n" );
        list_ptr = (struct list * ) malloc ( sizeof( struct list ) ); //alocirali smo novi čvor
        printf("Ucitaj element liste:");
        scanf( "%d", &list_ptr->value );
        *head = list_ptr; // headu smo dodali list_ptr koji ima jedan čvor
        (*head)->next = NULL; //kraj liste samo jedan čvor
      //  free (list_ptr);
    }
    else //lista nije prazna dodat ce mo novi cvor na početak
    {
        printf ( "LISTA NIJE PRAZNA DODAJEMO NOVI ČVOR NA POČETAK\n" );
        list_ptr = (struct list * ) malloc ( sizeof( struct list ) ); //alocirali smo novi čvor
        printf("Ucitaj element liste:");
        scanf( "%d", &list_ptr->value );
        list_ptr->next = (*head)->next; //spajamo list_ptr-<next sa head->next, kod prvog poziva "else" to će biti NULL
        (*head)->next = list_ptr; //head->next ne pokazuje više na NULL već na list_ptr koji pokazuje na NULL - to vrijedi za prvi "else" poziv
       // free ( list_ptr );
    }

}
void main()
{
    struct list * head = NULL;
    int ch = 1;
    while ( ch != 3 )
    {
        printf ( "1 - input\n2 - list\n3 - end\n" );
        scanf( "%d", &ch );
        switch ( ch )
        {
        case 1:
            InsertOnBegean ( &head );
            break;
        case 2:
            PrintList ( head );
            break;
        default :
            break;
        }
    }
}


Prva sto mi pada u oko je sto bi trebalo koristiti pokazivac na pokazivac kada prosledjujes pokazivac funkciji. Druga,kriticnija, stvar je:

Code:
free (list_ptr);


Napravio si cvor, ubacio ga u listu, i sada brises taj memorijski prostor? Nigde nemas duplikat tog prostora..

Kod iznad radi..
[ artriba @ 26.11.2007. 13:15 ] @
hvala na kodu, učim se jedino ti prvi čvor malo šteka, kad uneseš 1, 2, 3, 4, on lista 1, 4, 3, 2 ali sad mi je puno jasnije
[ artriba @ 26.11.2007. 16:23 ] @
rešio sam se pointera na pointer ali nikako da uspostavim list 5, 4, 3, 2, 1 uvek dobijem 1, 5, 4, 3, 2 ili samo 2, 1

nedostaje mi kod označen komentarom koda u funkciji InsertOnBegean ( struct list * head ) da uspostavim listu
evo koda
Code:
#include <stdio.h>
#include <stdlib.h>
#define _CRT_SECURE_NO_DEPRECATE 1;
void InsertOnBegean( struct list * );
void PrintLIst ( struct list * );

struct list
{
    int value;
    struct list * next;
};
void PrintList(struct list * head)
{
    if ( head ) 
    {
        while ( head != NULL ) 
        {
            printf ( "%d", head->value ); 
            head = head->next; 
        }
    }
    else
    {
        printf ("Lista je prazna");
    }
    printf("\n");
}    
void InsertOnBegean( struct list * head )
{
    struct list * list_ptr;
    list_ptr = (struct list * ) malloc ( sizeof( struct list ) ); 
    printf("Ucitaj element liste:");
    scanf( "%d", &list_ptr->value );
    /*
            stara glava pokazuje na NULL - jedini element liste
            nova glava pokazuje na staru glavu

    */
}
void main()
{
    struct list * head = NULL;
    int ch = 1;
    while ( ch != 3 )
    {
        printf ( "1 - input\n2 - list\n3 - end\n" );
        scanf( "%d", &ch );
        switch ( ch )
        {
        case 1:
        if (  head == NULL )
        {

            head = (struct list * ) malloc ( sizeof( struct list ) );
            printf("Ucitaj 1. element liste:");
            scanf( "%d", &head->value );
            head->next = NULL;
        }
        else
            InsertOnBegean ( head );
            break;
        case 2:
            PrintList ( head );
            break;
        default :
            break;
        }
    }
}
[ mjux @ 26.11.2007. 17:39 ] @
Code:

#include <stdio.h>
#include <stdlib.h>
#define _CRT_SECURE_NO_DEPRECATE 1;
void InsertOnBegean( struct list ** );
void PrintLIst ( struct list * );

struct list
{
     int value;
     struct list * next;
};
void PrintList(struct list * head)
{
     if ( head )
     {
          while ( head != NULL )
          {
                printf ( "%d", head->value );
                head = head->next;
          }
     }
     else
     {
          printf ("Lista je prazna");
     }
     printf("\n");
}
void InsertOnBegean( struct list ** head )
{
     struct list * list_ptr;
     list_ptr = (struct list * ) malloc ( sizeof( struct list ) );
     printf("Ucitaj element liste:");
     scanf( "%d", &list_ptr->value );
     list_ptr->next=NULL;
     if(*head==NULL)*head=list_ptr;
     else
     {
            list_ptr->next=*head;
            *head=list_ptr;
     }
}
void main()
{
     struct list * head = NULL;
     int ch = 1;
     while ( ch != 3 )
     {
          clrscr();
          printf ( "1 - input\n2 - list\n3 - end\n" );
          scanf( "%d", &ch );
          switch ( ch )
          {
          case 1:
                InsertOnBegean ( &head );
                break;
          case 2:
                PrintList ( head );
                getch();
                break;
          default :
                break;
          }
     }
}
[ artriba @ 26.11.2007. 18:04 ] @
I ja sam uspio slično izgleda da može samo pointer na pointer
Code:
void InsertOnBegean( struct list ** head )// funkcija koja postavlja novi element na početak
{

    struct list * list_ptr;
    list_ptr = (struct list * ) malloc ( sizeof( struct list ) ); 
    printf("Ucitaj element liste:");
    scanf( "%d", &list_ptr->value );
    list_ptr->next = *head;
    *head = list_ptr;
    
    
}
void main()
{
    struct list * head = NULL;
    int ch = 1;
    //Izbornik, sadrzi funkciju koja postavlja element na početak liste, te funkciju koja lista listu, na 3 se izlazi
    while ( ch != 3 )
    {
        printf ( "1 - input\n2 - list\n3 - end\n" );
        scanf( "%d", &ch );
        switch ( ch )
        {
        case 1:
        if (  head == NULL )//ako je head jednak NULL lista je prazna alociramo novi čvor i postavimo pokazicač head->next na NULL
        {

            head = (struct list * ) malloc ( sizeof( struct list ) );
            printf("Ucitaj 1. element liste:");
            scanf( "%d", &head->value );
            head->next = NULL;
        }
        else// ako head nije NULL lista ima elemenata, pozivamo funkciju koja postavlja novi element na početak 
            InsertOnBegean ( &head );
            break;
        case 2:
            PrintList ( head );
            break;
        default :
            break;
        }
    }
}
[ mjux @ 26.11.2007. 18:18 ] @
to je ta ista varijanta... samo mislim da je bojle da se provera head==NULL postavi u funkciju jer je glavni kod time manji, a funkcija je univerzalnija i mogla bi da se koristi za svaki slucaj DodajNaPocetak, pa bi se cak mogla i staviti u poseban header...:)

pointer na pointer mora jer se vrednost head-a menja u funkciji jer svaki putk kad se funkcija zavrsi head pokazuje na drugu adresu... ne bi moralo da se koristi ako bi koristio funkciju DodajNaKraj
[ Burgos @ 26.11.2007. 18:43 ] @
PS. Trebalo bi da posedujes i funkciju koja brise listu i oslobadja zauzeti memorijski prostor.
[ Nemanja.Ciric @ 26.11.2007. 19:41 ] @
Mrzi me da čitam ovo sve ako je već odgovoreno, da li imate konačan odgovor ili ne? :)