EXAMPLE OF DYNAMIC ALLOCATION
/* linked list example, pr101, 1994 */ #include <string.h> #include <alloc.h> #include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <conio.h> /* definition of a node */ 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 *) )); } /* free memory allocated for node */ void freenodes( struct node *headptr ) { struct node *temp; while( headptr ) { temp = headptr->next; free( headptr ); headptr = temp; } } /* insert a new node after nodeptr, return 1 = success */ int insert( struct node *nodeptr ) { char buffer[20]; struct node *newptr; newptr = initialise(); /* allocate a new node */ if( newptr == NULL ) { return 0; } else { /* fill in its data and add to the list */ newptr->next = nodeptr->next; nodeptr->next = newptr; nodeptr = newptr; printf("\nEnter data --->"); readline( buffer ); strcpy( nodeptr->data, buffer ); } return 1; } /* delete a node from list */ void delete( struct node *headptr, struct node *nodeptr ) { struct node *deletepointer, *previouspointer; char buffer[20]; deletepointer = headptr->next; previouspointer = headptr; /* find the entry */ printf("\nEnter name to be deleted --->"); readline( buffer ); while( deletepointer ) { if( strcmp( buffer, deletepointer->data ) == 0 ) { /* delete node pointed to by delete pointer */ previouspointer->next = deletepointer->next; break; } else { /* goto next node in list */ deletepointer = deletepointer->next; previouspointer = previouspointer->next; } } /* did we find it? */ if( deletepointer == NULL ) printf("\n\007Error, %s not found or list empty\n", buffer); else { free( deletepointer ); /* adjust nodeptr to the last node in list */ nodeptr = headptr; while( nodeptr->next != NULL ) nodeptr = nodeptr->next; } } /* print out the list */ void list( struct node *headptr ) { struct node *listpointer; listpointer = headptr->next; if( listpointer == NULL ) printf("\nThe list is empty.\n"); else { while( listpointer ) { printf("Name : %20s\n", listpointer->data ); listpointer = listpointer->next; } } } /* main menu system */ void menu( struct node *headp, struct node *nodep ) { int menuchoice = 1; char buffer[20]; while( menuchoice != 4 ) { printf("1 insert a node\n"); printf("2 delete a node\n"); printf("3 list nodes\n"); printf("4 quit\n"); printf("Enter choice -->"); readline( buffer ); menuchoice = atoi( buffer ); switch( menuchoice ) { case 1 : if( insert( nodep ) == 0 ) printf("\n\007Insert failed.\n"); break; case 2 : delete( headp, nodep ); break; case 3 : list( headp ); break; case 4 : break; default : printf("\n\007Invalid option\n"); break; } } } main() { struct node *headptr, *nodeptr; headptr = initialise(); nodeptr = headptr; headptr->next = NULL; menu( headptr, nodeptr ); freenodes( headptr ); }