Programiranje u C-u

  

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

©Copyright B Brown. 1984-1998. All rights reserved.