/** BEGIN COPYRIGHT BLOCK * This Program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; version 2 of the License. * * This Program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * this Program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place, Suite 330, Boston, MA 02111-1307 USA. * * In addition, as a special exception, Red Hat, Inc. gives You the additional * right to link the code of this Program with code not covered under the GNU * General Public License ("Non-GPL Code") and to distribute linked combinations * including the two, subject to the limitations in this paragraph. Non-GPL Code * permitted under this exception must only link to the code of this Program * through those well defined interfaces identified in the file named EXCEPTION * found in the source code files (the "Approved Interfaces"). The files of * Non-GPL Code may instantiate templates or use macros or inline functions from * the Approved Interfaces without causing the resulting work to be covered by * the GNU General Public License. Only Red Hat, Inc. may make changes or * additions to the list of Approved Interfaces. You must obey the GNU General * Public License in all respects for all of the Program code and other code used * in conjunction with the Program except the Non-GPL Code covered by this * exception. If you modify this file, you may extend this exception to your * version of the file, but you are not obligated to do so. If you do not wish to * provide this exception without modification, you must delete this exception * statement from your version and license this file solely under the GPL without * exception. * * * Copyright (C) 2001 Sun Microsystems, Inc. Used by permission. * Copyright (C) 2005 Red Hat, Inc. * All rights reserved. * END COPYRIGHT BLOCK **/ #ifdef HAVE_CONFIG_H # include #endif /* testavl.c - Test Tim Howes AVL code */ #ifdef _WIN32 #include #endif #include #include #include "avl.h" char *strdup( s ) char *s; { char *new; if ( (new = (char *) malloc( strlen( s ) + 1 )) == NULL ) return( NULL ); strcpy( new, s ); return( new ); } main( argc, argv ) int argc; char **argv; { Avlnode *tree = NULLAVL; char command[ 10 ]; char name[ 80 ]; char *p; int free(), strcmp(); printf( "> " ); while ( fgets( command, sizeof( command ), stdin ) != NULL ) { switch( *command ) { case 'n': /* new tree */ ( void ) avl_free( tree, free ); tree = NULLAVL; break; case 'p': /* print */ ( void ) myprint( tree ); break; case 't': /* traverse with first, next */ printf( "***\n" ); for ( p = (char * ) avl_getfirst( tree ); p != NULL; p = (char *) avl_getnext( tree, p ) ) printf( "%s\n", p ); printf( "***\n" ); break; case 'f': /* find */ printf( "data? " ); if ( fgets( name, sizeof( name ), stdin ) == NULL ) exit( 0 ); name[ strlen( name ) - 1 ] = '\0'; if ( (p = (char *) avl_find( tree, name, strcmp )) == NULL ) printf( "Not found.\n\n" ); else printf( "%s\n\n", p ); break; case 'i': /* insert */ printf( "data? " ); if ( fgets( name, sizeof( name ), stdin ) == NULL ) exit( 0 ); name[ strlen( name ) - 1 ] = '\0'; if ( avl_insert( &tree, strdup( name ), strcmp, avl_dup_error ) != OK ) printf( "\nNot inserted!\n" ); break; case 'd': /* delete */ printf( "data? " ); if ( fgets( name, sizeof( name ), stdin ) == NULL ) exit( 0 ); name[ strlen( name ) - 1 ] = '\0'; if ( avl_delete( &tree, name, strcmp ) == NULL ) printf( "\nNot found!\n" ); break; case 'q': /* quit */ exit( 0 ); break; case '\n': break; default: printf("Commands: insert, delete, print, new, quit\n"); } printf( "> " ); } /* NOTREACHED */ } static ravl_print( root, depth ) Avlnode *root; int depth; { int i; if ( root == 0 ) return; ravl_print( root->avl_right, depth+1 ); for ( i = 0; i < depth; i++ ) printf( " " ); printf( "%s %d\n", root->avl_data, root->avl_bf ); ravl_print( root->avl_left, depth+1 ); } myprint( root ) Avlnode *root; { printf( "********\n" ); if ( root == 0 ) printf( "\tNULL\n" ); else ( void ) ravl_print( root, 0 ); printf( "********\n" ); }