/* Uiversal_queue.c -- 队列实现文件 */ #include "Uiversal_queue.h" /* Proclaim local functions */ static Node * makeNode (const Item * const pi) ; /* Define interface functions */ Bool Initialize_Q (Queue * const pq) { *pq = (struct queue *) malloc (sizeof (struct queue)) ; if (NULL == *pq) return FALSE ; (*pq) -> front = (*pq) -> rear = NULL ; (*pq) -> current = 0 ; return TRUE ; } Bool IsEmpty_Q (const Queue * const pq) { return 0 == (*pq) -> current ; } Bool Insert_Q (Queue * const pq, const Item * const pi) { Node * new_node ; new_node = makeNode (pi) ; if (NULL == new_node) return FALSE ; else { if (IsEmpty_Q (pq)) (*pq) -> front = (*pq) -> rear = new_node ; else { (*pq) -> rear -> next = new_node ; (*pq) -> rear = (*pq) -> rear -> next ; } (*pq) -> current++ ; return TRUE ; } } Bool Delete_Q (Queue * const pq, Item * const pi) { Node * scan, * temp ; if (IsEmpty_Q (pq)) return FALSE ; else if (1 == (*pq) -> current) { *pi = (*pq) -> front -> item ; free ((*pq) -> front) ; (*pq) -> front = (*pq) -> rear = NULL ; (*pq) -> current-- ; return TRUE ; } else { scan = (*pq) -> front ; if (pi -> leavings == scan -> item.leavings) { *pi = (*pq) -> front -> item ; (*pq) -> front = (*pq) -> front -> next ; free (scan) ; (*pq) -> current-- ; return TRUE ; } else { while (scan) { if (pi -> leavings == scan -> next -> item.leavings) break ; else scan = scan -> next ; } if (pi -> leavings == scan -> next -> item.leavings) { temp = scan -> next ; scan -> next = scan -> next -> next ; free (temp) ; (*pq) -> current-- ; return TRUE ; } else return FALSE ; } } } void Traversal_Q (const Queue * const pq, void (* pfun) (const Item * const pi)) { Node * scan ; scan = (*pq) -> front ; while (scan) { (* pfun) (&scan -> item) ; scan = scan -> next ; } } void Release_Q (const Queue * const pq) { Node * scan, * temp ; scan = (*pq) -> front ; while (scan) { temp = scan ; scan = scan -> next ; free (temp) ; } } /* Define local functions */ static Node * makeNode (const Item * const pi) { Node * new_node ; new_node = (Node *) malloc (sizeof (Node)) ; if (NULL == new_node) return NULL ; else { new_node -> item = *pi ; new_node -> next = NULL ; return new_node ; } }