分享:泛型队列
最近一点做题看书的心情的都没有。数据结构停在了二叉树,看来会停很久。
所以……今天有时间完成了一个月以前就该完成的事,拿出来分享给大家。
虽然完全不知道大家是否对此感兴趣。
程序代码:
//测试: #include "queue.h" #include <stdio.h> MakeQueue( int, _int ) MakeQueue( char, _char ) int main( void ) { int ix; Create_int(); Create_char(); for( ix = 0; 20 > ix; ++ix ) { Insert_int( ix ); Insert_char( 'a' + ix ); } printf( "队列1:\n" ); while( !Is_Empty_int() ) { printf( "%d ",First_int() ); Delete_int(); } printf( "\n队列2:\n" ); while( !Is_Empty_char() ) { printf( "%c ",First_char() ); Delete_char(); } Destroy_int(); Destroy_char(); return 0; }
程序代码:
//泛型队列: #include <stdio.h> #include <stdlib.h> #include <assert.h> #define INITSIZE 128 #define MakeQueue( ElementType, Name ) \ void Insert##Name( ElementType Value ); \ ElementType First##Name( void ); \ void Delete##Name( void ); \ int Is_Full##Name( void ); \ int Is_Empty##Name( void ); \ void Destroy##Name( void ); \ void Create##Name( void ); \ \ static ElementType *Queue##Name; \ static int CurrentSize##Name = INITSIZE; \ static int Frnot##Name = 1; \ static int Read##Name = 0; \ \ \ void Insert##Name( ElementType Value ) \ { \ assert( !Is_Full##Name() ); \ assert( NULL != Queue##Name ); \ Read##Name = ( Read##Name + 1 ) % CurrentSize##Name; \ Queue##Name[ Read##Name ] = Value; \ } \ \ \ ElementType First##Name( void ) \ { \ assert( !Is_Empty##Name()); \ assert( NULL != Queue##Name ); \ return Queue##Name[ Frnot##Name ]; \ } \ \ \ void Delete##Name( void ) \ { \ assert( !Is_Empty##Name() ); \ assert( NULL != Queue##Name ); \ Frnot##Name = ( Frnot##Name + 1 ) % CurrentSize##Name; \ } \ \ int Is_Full##Name( void ) \ { \ int i; \ ElementType *Temp; \ \ assert( NULL != Queue##Name ); \ i = ( Read##Name + 2 ) % CurrentSize##Name; \ \ if( i == Frnot##Name ) \ { \ CurrentSize##Name += INITSIZE; \ Temp = ( ElementType * )realloc( Queue##Name, CurrentSize##Name * sizeof( ElementType ) ); \ if( NULL == Temp ) \ { \ CurrentSize##Name -= INITSIZE; \ return 1; \ } \ Queue##Name = Temp; \ return 0; \ } \ \ return 0; \ } \ \ \ int Is_Empty##Name( void ) \ { \ return ( Read##Name + 1 ) % CurrentSize##Name == Frnot##Name; \ } \ \ \ void Create##Name( void ) \ { \ assert( NULL == Queue##Name ); \ if( NULL == ( Queue##Name = ( ElementType * )malloc( CurrentSize##Name * sizeof( ElementType ) ) ) ) \ exit( EXIT_FAILURE ); \ } \ \ \ void Destroy##Name( void ) \ { \ assert( NULL != Queue##Name ); \ free( Queue##Name ); \ Queue##Name = NULL; \ CurrentSize##Name = INITSIZE; \ Frnot##Name = 1; \ Read##Name = 0; \ }
[此贴子已经被作者于2017-4-22 10:25编辑过]