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 );
}