Ovaj kod kreira i ispisuje listu od 10 elemenata tako da postavlja nove članove na početak i radi normalno
#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;
}
}
#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.
#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;
}
}
}