/* --- Function: void enqueue_node(Queue que) --- */ void enqueue_node(Queue que) { int tmp, *pi; char mess[BUFSIZ]; do { my_clearscrn(); printf("--- ENQUEUE NODE TO QUEUE ---\n"); printf("\nCurrent queue status(%d nodes): ", QUEUEsize(que)); SLISTtraverse(que, print, SLIST_FWD); tmp = read_int("\nEnter integer data of node to be enqueued (-1=Quit): ", 0, 0); if (tmp == -1) break; pi = (int *)malloc(sizeof(int)); MALCHK(pi); *pi = tmp; if ((QUEUEenqueue(que, pi)) != OK) { printf("\nFatal error enqueing data - exiting...!"); QUEUEdestroy(que); exit(-1); } else { sprintf(mess, "Node %d will be enqueued!", *pi); prompt_and_pause(mess); } } while (TRUE); }
/* --- Function: void final_status(Queue que, Stack stk) --- */ void final_status(Queue que, Stack stk) { /* Final list status... */ my_clearscrn(); printf("--- FINAL STATUS ---\n"); printf("\nFinal list contents: "); printf("\nQueue: "); SLISTtraverse(que, print, SLIST_FWD); printf(" (%d nodes)", QUEUEsize(que)); printf("\nStack: "); SLISTtraverse(stk, print, SLIST_FWD); printf(" (%d nodes)", STACKsize(stk)); }
/* --- Function: void print_queue_stack(Queue que, Stack stk) --- */ void print_queue_stack(Queue que, Stack stk) { my_clearscrn(); printf("--- PRINT QUEUE AND STACK ---\n"); printf("\nCurrent contents: "); printf("\nQueue: "); SLISTtraverse(que, print, SLIST_FWD); printf(" (%d nodes)", QUEUEsize(que)); printf("\nStack: "); SLISTtraverse(stk, print, SLIST_FWD); printf(" (%d nodes)", STACKsize(stk)); prompt_and_pause("\n\n"); }
/* --- Function: void dequeue_node(Queue que) --- */ void dequeue_node(Queue que) { int tmp, *pi, *ptmp; char mess[BUFSIZ], ans; /* Initialize 'tmp'... */ tmp = 0; do { if (tmp == -1) break; my_clearscrn(); printf("--- DEQUEUE NODE FROM QUEUE ---\n"); printf("\nCurrent queue status(%d nodes): ", QUEUEsize(que)); SLISTtraverse(que, print, SLIST_FWD); ptmp = (int *)QUEUEpeek(que); if (ptmp == NULL) { prompt_and_pause("\n\nQueue is EMPTY - nothing to do..!"); tmp = -1; } else { sprintf(mess, "\nAbout to dequeue node %d.. - Continue? (y/n): ", *ptmp); ans = read_char(mess, 0, 0, my_chkch); if (ans == 'y' || ans == 'Y') { if ((QUEUEdequeue(que, (void **)&pi)) != OK) { printf("\nFatal error dequeing data - exiting...!"); QUEUEdestroy(que); exit(-1); } else { sprintf(mess, "Node %d will be dequeued!", *pi); prompt_and_pause(mess); my_destroy(pi); } } else tmp = -1; } } while (TRUE); }
/* --- void queue_elements(Queue que, int nr_of_ele) --- */ void queue_elements(Queue que, int nr_of_ele) { int i=0, *pi, retval; do { pi = (int *)malloc(sizeof(int)); *pi = my_random(1,50); retval = QUEUEenqueue(que, pi); assert(retval == OK); } while (++i < nr_of_ele); printf("\nCurrent queue content(%d elements): ", QUEUEsize(que)); /* This call to SLISTtraverse is possible - although this function is NOT a member of the queue (public) interface - but because a queue is also a list ! */ SLISTtraverse(que, print, SLIST_FWD); }
/* --- Function: void queue_nodess(Queue que, Stack stk, int nr_of_ele) --- */ void enqueue_push_nodes(Queue que, Stack stk, int nr_of_ele) { int i=0, *pi, retval; my_clearscrn(); printf("--- CREATING QUEUE AND STACK (%d nodes each), RANDOM INTEGER DATA ---\n", NR_OF_ITEMS); do { /* Create dyn. memory, store random nr - and enqueue... */ pi = (int *)malloc(sizeof(int)); MALCHK(pi); *pi = rand_int(1,50); retval = QUEUEenqueue(que, pi); assert(retval == OK); /* Create dyn. memory, store random nr - and push... */ pi = (int *)malloc(sizeof(int)); MALCHK(pi); *pi = rand_int(1,50); retval = STACKpush(stk, pi); assert(retval == OK); } while (++i < nr_of_ele); printf("\nCurrent queue and stack status: "); printf("\nQueue(%d nodes): ", QUEUEsize(que)); SLISTtraverse(que, print, SLIST_FWD); printf("\nStack(%d nodes): ", STACKsize(stk)); SLISTtraverse(stk, print, SLIST_FWD); prompt_and_pause("\n\n"); }
int main(void) { /* Declare YOUR variables here ! */ Stack mystk; Queue myqueue; char mess[BUFSIZ]; int i, nr; srand((unsigned int)time(NULL)); my_clearscrn(); printf("--- INITIALIZING A QUEUE, %d ELEMENTS, RANDOM INTEGER DATA ---", NR_OF_ITEMS); if ((myqueue = QUEUEinit(my_destroy)) == NULL) /* Initialize the queue... */ { printf("\nFatal error - bailing out...!"); exit(-1); } queue_elements(myqueue, NR_OF_ITEMS); /* Populate the queue... */ nr = QUEUEsize(myqueue)/2; /* Save half the size of the queue... */ sprintf(mess, "\nNext - let's DEQUEUE %d elements from our queue...", nr); prompt_and_pause(mess); prompt_and_pause("...and now PUSH them - on a brand, new STACK...!!"); if ((mystk = STACKinit(my_destroy)) == NULL) /* Set up a new stack... */ { printf("\nFatal error - bailing out...!"); exit(-1); } for (i = 0; i < nr; ++i) { void *piq, *pis; int retval; retval = QUEUEdequeue(myqueue, &piq); assert(retval == OK); sprintf(mess, "QUEUE: Dequeued: %02d (new frontvalue: %02d)", *(int *)piq, *(int *)QUEUEpeek(myqueue)); prompt_and_pause(mess); /* Check current stack top... */ pis = STACKpeek(mystk); /* Push the value just dequeued - from our queue... */ retval = STACKpush(mystk, piq); assert(retval == OK); if (pis == NULL) /* If this is the FIRST stack push... */ sprintf(mess, "STACK: Pushed : %02d (old stacktop : none)", *(int *)STACKpeek(mystk)); else sprintf(mess, "STACK: Pushed : %02d (old stacktop : %02d)", *(int *)STACKpeek(mystk), *(int *)pis); /* Print the message assembled above... */ prompt_and_pause(mess); } printf("\n--- CURRENT STATUS OF STACK AND QUEUE ---"); printf("\nStack: "); SLISTtraverse(mystk, print, SLIST_FWD); printf("\nQueue: "); SLISTtraverse(myqueue, print, SLIST_FWD); prompt_and_pause("\n\nLet's tidy up (destroy queue/stack) - Bye!"); SLISTdestroy(mystk); SLISTdestroy(myqueue); return 0; }