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

pomoć oko vezanih lista

[es] :: C/C++ programiranje :: C/C++ za početnike :: pomoć oko vezanih lista

[ Pregleda: 2233 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

artriba
Split

Član broj: 158342
Poruke: 109
*.adsl.net.t-com.hr.



Profil

icon pomoć oko vezanih lista26.11.2007. u 12:38 - pre 199 meseci
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;
        }
    }
}
 
Odgovor na temu

Burgos
Nemanja Borić
Amazon Web Services
Berlin

Član broj: 12484
Poruke: 1947
217.169.209.*

Sajt: stackoverflow.com/users/1..


+480 Profil

icon Re: pomoć oko vezanih lista26.11.2007. u 13:01 - pre 199 meseci
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..
 
Odgovor na temu

artriba
Split

Član broj: 158342
Poruke: 109
*.adsl.net.t-com.hr.



Profil

icon Re: pomoć oko vezanih lista26.11.2007. u 13:15 - pre 199 meseci
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
 
Odgovor na temu

artriba
Split

Član broj: 158342
Poruke: 109
*.adsl.net.t-com.hr.



Profil

icon Re: pomoć oko vezanih lista26.11.2007. u 16:23 - pre 199 meseci
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;
        }
    }
}
 
Odgovor na temu

mjux

Član broj: 124150
Poruke: 158
*.ADSL.neobee.net.



+2 Profil

icon Re: pomoć oko vezanih lista26.11.2007. u 17:39 - pre 199 meseci
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;
          }
     }
}
 
Odgovor na temu

artriba
Split

Član broj: 158342
Poruke: 109
*.adsl.net.t-com.hr.



Profil

icon Re: pomoć oko vezanih lista26.11.2007. u 18:04 - pre 199 meseci
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;
        }
    }
}
 
Odgovor na temu

mjux

Član broj: 124150
Poruke: 158
*.ADSL.neobee.net.



+2 Profil

icon Re: pomoć oko vezanih lista26.11.2007. u 18:18 - pre 199 meseci
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
 
Odgovor na temu

Burgos
Nemanja Borić
Amazon Web Services
Berlin

Član broj: 12484
Poruke: 1947
217.169.209.*

Sajt: stackoverflow.com/users/1..


+480 Profil

icon Re: pomoć oko vezanih lista26.11.2007. u 18:43 - pre 199 meseci
PS. Trebalo bi da posedujes i funkciju koja brise listu i oslobadja zauzeti memorijski prostor.
 
Odgovor na temu

Nemanja.Ciric
web dizajner/programer, Niteoweb
Novi Sad/Subotica

Član broj: 163398
Poruke: 63
*.ns.ac.yu.

Jabber: serj.cobain@gmail.com


Profil

icon Re: pomoć oko vezanih lista26.11.2007. u 19:41 - pre 199 meseci
Mrzi me da čitam ovo sve ako je već odgovoreno, da li imate konačan odgovor ili ne? :)
NĆirić
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: pomoć oko vezanih lista

[ Pregleda: 2233 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

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