|
[ 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 normalnoCode: #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 radiCode: #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? :)
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|