#ifndef QUEUE_H #define QUEUE_H #include "common.h" #ifdef TREE #define QElemType Tree #else #define QElemType ElemType #endif typedef struct _SQueue{ QElemType *addr; int head; int tail; int size; }SQueue; status QueueInit(SQueue* queue); status QueueDestroy(SQueue* queue); status QueueWrite(SQueue* queue,QElemType e); status QueueRead(SQueue* queue,QElemType* e); BOOL QueueIsEmpty(SQueue* queue); void QueuePrint(SQueue* queue); #endif
//#include "common.h" #include "Queue.h" status QueueInit(SQueue* queue); status QueueDestroy(SQueue* queue); status QueueWrite(SQueue* queue,QElemType e); status QueueRead(SQueue* queue,QElemType* e); void QueuePrint(SQueue* queue); void QueuePrint(SQueue* queue) { int i; for(i=0; i<MAX_INIT_SIZE; i++) { printf("%c ",queue->addr[i]); } printf("=========\n"); } status QueueInit(SQueue* queue) { assert( NULL != (queue->addr = (QElemType*)malloc(sizeof(QElemType)*MAX_INIT_SIZE))); queue->head = -1; queue->tail = 0; queue->size = MAX_INIT_SIZE; memset(queue->addr,0,queue->size); return 0; } status QueueDestroy(SQueue* queue) { if(queue != NULL) { free(queue->addr); } return 1; } /************************************************************************/ //tail keep empty /************************************************************************/ status QueueWrite(SQueue* queue,QElemType e) { assert(queue != NULL); if(queue->tail == queue->head) { printf("over flow\n"); return -1; } else { queue->addr[queue->tail] = e; } if(queue->tail == queue->size-1) { queue->tail = 0; } else { queue->tail += 1; } if(queue->head == -1) { queue->head = 0; } return 0; } status QueueRead(SQueue* queue,QElemType* e) { if(queue->head < 0) { printf("Queue is empty\n"); //*e = '\r'; return -1; } *e = queue->addr[queue->head]; if(queue->head == queue->size-1) { queue->head = 0; } else { queue->head += 1; } if(queue->head == queue->tail) { queue->head = -1; queue->tail = 0; } return 0; } BOOL QueueIsEmpty(SQueue* queue) { int ret = 0; if(queue->head < 0) { return 1; } return ret; } #ifndef TREE void WriteToQueue(SQueue* queue) { QElemType get,read; printf("anykey to start\n"); while((get = fgetc(stdin)) != 'q') { printf("\nr/w to switch\nwrite:\n"); while((get = fgetc(stdin)) != 'r') { printf(">>%c ",get); QueueWrite(queue,get); } QueuePrint(queue); printf("read:\n"); while((get = fgetc(stdin)) != 'w') { read = '='; QueueRead(queue,&read); printf("%c ",read); } } } #endif
/************************************************************************ 层序遍历: ************************************************************************/ void LevelOrderTraverse(Tree T) { SQueue queue; Tree p = T; QueueInit(&queue); QueueWrite(&queue,p); while(!QueueIsEmpty(&queue)) { if(QueueRead(&queue,&p)<0) { printf("empty!!!\n"); //break; } printf("<%c>",p->data); if(p->lChild) { QueueWrite(&queue,p->lChild); } if(p->rChild) { QueueWrite(&queue,p->rChild); } } QueueDestroy(&queue); }