Queue.h
1 #ifndef _queue_h_2 #define_queue_h_3#include <stdbool.h>4 #defineMaxqueue 105 6 //Defining queue Types7typedefintItem;8 9 //node of the queueTentypedefstructnode one { a Item item; - structNode *next; - }node; the -typedefstructQueue - { -Node * front;//record the first item of a queue +Node * rear;//record the last item in a queue - intItems//number of record items + }queue; a at voidInitqueue (Queue *pq); - BOOLQueueisfull (ConstQueue *pq); - BOOLQueueisempty (ConstQueue *pq); - intQueueitemcount (ConstQueue *pq); - BOOLEnQueue (item item, Queue *pq); - BOOLDeQueue (Item * pitem, Queue *pq); in voidEmptythequeue (Queue *pq); - to #endif
use_q.c/* function Function Implementation */
1#include <stdio.h>2#include <stdlib.h>3#include"queue.h"4 5 Static voidCopytonode (item item, Node * Pn)//copy content to a node6 {7Pn->item =item;8 }9 Static voidCopytoitem (Node * pn, Item * pi)//copies the item contents of an item to an item variableTen { one*pi = pn->item; a } - - voidInitqueue (Queue * Pq)//Initialize Queue the { -Pq->front = Pq->rear = NULL;//Initialize the Queue's end-to-end pointers to null -Pq->items =0;//Initialize the number of items to 0 - } + BOOLQueueisfull (ConstQueue *Pq) - { + returnPq->items = =maxqueue; a } at BOOLQueueisempty (ConstQueue *Pq) - { - returnPq->items = =0; - } - intQueueitemcount (ConstQueue *Pq) - { in returnPq->items; - } to BOOLEnQueue (item item, Queue * pq)//add an item at the end of the queue + { -Node * pnew;//to create a new node the * if(queueisfull (pq)) $ return false;Panax NotoginsengPnew = (Node *)malloc(sizeof(Node));//request space for a new node - if(pnew = =NULL) the { +fprintf (stderr,"Unable to allocate memory!\n"); a Exit (exit_failure); the } +Copytonode (item, pnew);//Copy the item content to the new node -Pnew->next = NULL;//place the next member of the new node NULL to indicate that this is the last item in the current queue $ if(queueisempty (pq))//if the queue is empty, the new node is used as the header of the queue $Pq->front =pnew; - Else //otherwise, Place the address of the new node in the next member of the tail item of the queue -Pq->rear->next =pnew; thePq->rear = pnew;//to use a new node as the tail item of a queue -pq->items++;Wuyi the return true; - } wu - BOOLDeQueue (Item * pitem, Queue *Pq) about { $Node *pt; - //the Pitem and PT are used to store the contents of the deleted Item. - if(queueisempty (pq)) - return false; a //Copy the contents of the deleted item to the temporary pointer +Copytoitem (pq->front, pitem); thePT = pq->front; - $Pq->front = pq->front->next; the free(pt); thepq->items--; the if(pq->items = =0)//When you delete the last item, you set the tail pointer and the head pointer to null at the same time. thePq->rear =NULL; - return true; in } the voidEmptythequeue (Queue *Pq) the { about Item dummy; the while(!Queueisempty (pq)) theDeQueue (&dummy, pq); the}
main.c/* user Interface */
1#include <stdio.h>2#include"queue.h"3 4 intMainvoid)5 {6 Queue line;7 Item temp;8 Charch;9 TenInitqueue (&line ); onePuts"Testing the Queue interface. Type A To add a value,"); aPuts"Type D To delete a Value,and type q to Quit."); - while(ch = GetChar ())! ='Q') - { the if(ch! ='a'&&ch! ='D') - Continue; - if(ch = ='a') - { +printf"Interger to Add:"); -scanf"%d", &temp); + if(! Queueisfull (&line )) a { atprintf"putting%d into queue\n", temp); -EnQueue (temp, &line ); - } - Else -Puts"Queue is full!"); - } in Else - { to if(queueisempty (&line )) +Puts"Nothing to delete!"); - Else the { *DeQueue (&temp, &line ); $printf"%removing%d from queue\n", temp);Panax Notoginseng } - } theprintf"%d items in queue\n", Queueitemcount (&line )); +Puts"Type A to Add,d to Delete,q to Quit:"); a } theEmptythequeue (&line ); +Puts"bye!"); - $ return 0; $}
Basic C language implementation of the "ADT" queue