PRIMJER DINAMIČKE ALOKACIJE
/* primjer vezane liste, pr101, 1994 */ #include <string.h> #include <alloc.h> #include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <conio.h> /* definicija čvora */ struct node { char data[20]; struct node *next; }; struct node * initialise( void ); void freenodes( struct node * ); int insert( struct node * ); void delete( struct node *, struct node * ); void list( struct node * ); void menu( struct node *, struct node * ); void readline( char [] ); void readline( char buff[] ) { int ch, loop = 0; ch = getche(); while( ch != '\r' ) { buff[loop] = ch; loop++; ch = getche(); } buff[loop] = 0; } struct node * initialise( void ) { return( (struct node *) calloc(1, sizeof( struct node *) )); } /* oslobađanje memorije alocirane za čvor */ void freenodes( struct node *headptr ) { struct node *temp; while( headptr ) { temp = headptr->next; free( headptr ); headptr = temp; } } /* ubacivanje novog čvora nakon nodeptr, vraća 1 ako je sve u redu */ int insert( struct node *nodeptr ) { char buffer[20]; struct node *newptr; newptr = initialise(); /* alociranje novog čvora */ if( newptr == NULL ) { return 0; } else { /* popunjavanje podataka i njihovo dodavanje listi */ newptr->next = nodeptr->next; nodeptr->next = newptr; nodeptr = newptr; printf("\nUnesi podatke --->"); readline( buffer ); strcpy( nodeptr->data, buffer ); } return 1; } /* brisanje čvora iz liste */ void delete( struct node *headptr, struct node *nodeptr ) { struct node *deletepointer, *previouspointer; char buffer[20]; deletepointer = headptr->next; previouspointer = headptr; /* nalaženje ulaza */ printf("\nUnesi ime koje će biti izbrisano --->"); readline( buffer ); while( deletepointer ) { if( strcmp( buffer, deletepointer->data ) == 0 ) { /* brisanje čvora na koji pokazuje delete pointer */
previouspointer->next = deletepointer->next; break; } else { /* idi na slijedeći čvor u listi */ deletepointer = deletepointer->next; previouspointer = previouspointer->next; } } /* jesmo li ga našli? */ if( deletepointer == NULL ) printf("\n\007Greška, %s nije nađen ili je lista prazna\n", buffer); else { free( deletepointer ); /* prilagodi nodeptr zadnjem čvoru liste */
nodeptr = headptr; while( nodeptr->next != NULL ) nodeptr = nodeptr->next; } } /* ispiši listu na ekran */ void list( struct node *headptr ) { struct node *listpointer; listpointer = headptr->next; if( listpointer == NULL ) printf("\nLista je prazna.\n"); else { while( listpointer ) { printf("Ime : %20s\n", listpointer->data ); listpointer = listpointer->next; } } } /* sistem glavnog izbornika */ void menu( struct node *headp, struct node *nodep ) { int menuchoice = 1; char buffer[20]; while( menuchoice != 4 ) { printf("1 unesi čvor\n"); printf("2 izbriši čvor\n"); printf("3 izlistaj čvorove\n"); printf("4 odustani\n"); printf("Unesi izbor -->"); readline( buffer ); menuchoice = atoi( buffer ); switch( menuchoice ) { case 1 : if( insert( nodep ) == 0 ) printf("\n\007Unos je neuspješan.\n"); break; case 2 : delete( headp, nodep ); break; case 3 : list( headp ); break; case 4 : break; default : printf("\n\007Kriva opcija\n"); break; } } } main() { struct node *headptr, *nodeptr; headptr = initialise(); nodeptr = headptr; headptr->next = NULL; menu( headptr, nodeptr ); freenodes( headptr ); }