======Project: Queue Library Implementation======
A project for C/C++, Data Structures, and System Programming by Karl Krauss during the SEMESTER YEAR.
I spent a few hours on this.
=====Objectives=====
The purpose of this project was to create a library for queues.
=====Prerequisites=====
In order to successfully accomplish/perform this project, the listed resources/experiences need to be consulted/achieved:
* understand functions
* understand pointers
* understand structs
* understand malloc()
=====Background=====
This was the next evolution of the doubly linked list and stack library. This is the queue library, taking what I learned from implementing the dl library this was much simpler.
=====Attributes=====
====Cprog attributes====
* variables
* pointers
* selection
* i/o
* repetition
* functions
* structures
* libraries
====Data Structures====
* Pointers
* Malloc/new
* linked list
* Doubly linked list
* Libraries
====Systems programming====
* Terminal I/O
=====Code=====
This is the header file:
#ifndef QUEUE_H
#define QUEUE_H
struct node { //predefined structure with one variable (
int value;
struct node *next;
struct node *prev;
};
typedef struct node Node;
struct queue {// predefined structure for use of returns in functions allow for easy access to start. *end is end of queue start is start
Node *start;
Node *end;
};
typedef struct queue
Queue;
Queue *enqueue(Queue *myQueue, int input);
Node *dequeue(Queue *myQueue);
Node *peek(Queue *myQueue);
//minimum variables needed in main: int input, Node *tmp, Node *tmp2, Queue *myList.
#endif
This is the code:
// This is an attempt at writing a queue library for a single variable that will include enqueue(),dequeue(), peek(),
// printList()
#include
#include
#include "queue.h"
Queue *enqueue(Queue *myQueue, int input)
{
if(myQueue->start == NULL) // this is to test if the list is gempty
{
myQueue->start = (Node *)malloc(sizeof(Node));
myQueue->end = myQueue->start; // with only one node end and start are the same
myQueue->start->next = NULL; //no nodes after start(no next)
myQueue->start->prev = NULL; //no nodes before start(no before)
myQueue->start->value = input; //value is now stored in first node
}
else // list is not empty so now will will create a new node and append
{
Node *tmp = (Node *)malloc(sizeof(Node));
myQueue->end->next = tmp; // end's next now points to tmp instead of null, so adding a new node to end of list
tmp->prev = myQueue->end; //new nodes prev now points to current end
myQueue->end = myQueue->end->next; // moves end to the true end of the list.
myQueue->end->value = input; // store input into new node(end)
myQueue->end->next = NULL;// nothing beyond the end of the list
}
return myQueue;
}
Node *dequeue(Queue *myQueue)
{
Node *dequeuedVal = NULL;
if (myQueue->start != NULL)//test if queue is empty
{
dequeuedVal = myQueue->start;// setting poppedVal equal to the current "top" of the stack
myQueue->start = myQueue->start->next;// changing the top of the list to the previous node
if(myQueue->start != NULL)
{
myQueue->start->prev = NULL;
}
/*else
/{
myStack->end->next = NULL; //disconnecting the old top from the list
}*/
}
return dequeuedVal;
}
=====Reflection=====
*As with doubly linked lists, I really learned a lot. This library was written quite some time ago and the best part is when I came back to it, I had learned enough to realize I could vastly improve upon it. Something I will possibly do in the future.