I'm practicing data structures in C and I implemented a queue based on its description:
#include <stdio.h>
#include <stdlib.h>
struct QueueNode {
int data;
struct QueueNode* nextNode;
};
struct Queue{
struct QueueNode* priorNode;
struct QueueNode* lastNode;
};
struct Queue* initQueue(){
struct Queue* queue = malloc(sizeof(struct Queue)); //only one is needed
if(!queue){
fprintf(stderr,"memory error");
exit(1);
}
queue->priorNode = NULL;
queue->lastNode = NULL;
return queue;
}
void enqueue(struct Queue* queue, int num){
struct QueueNode* queuenode = malloc(sizeof(struct QueueNode));
if(!queuenode){
fprintf(stderr,"memory error");
exit(1);
}
queuenode->data = num;
queuenode->nextNode = NULL;
if(!queue->priorNode){
queue->priorNode = queuenode;
}
if(queue->lastNode){
struct QueueNode* temp = queue->lastNode;
queue->lastNode = queuenode;
temp->nextNode = queue->lastNode;
} else {
queue->lastNode = queuenode;
}
}
struct QueueNode dequeue(struct Queue* queue){
if(!queue->priorNode){
fprintf(stderr,"Queue is empty.\n");
struct QueueNode nullnode = {0, NULL};
return nullnode;
}
struct QueueNode prior = *queue->priorNode;
free(queue->priorNode);
if(prior.nextNode){
queue->priorNode = prior.nextNode;
} else {
queue->priorNode = NULL;
}
return prior;
}
void peekQueue(struct Queue* queue){
printf("\"%d\" is the current prior element in the queue\n", queue->priorNode->data);
}
void listQueue(struct Queue* queue){
struct QueueNode* qn = queue->priorNode;
printf("elements in the queue from left(the most prior) to right(the least prior) are:\n");
while(qn){
if(!qn->nextNode){
printf("%d",qn->data);
break;
}
else{
printf("%d - ",qn->data);
qn = qn->nextNode;
}
}
printf("\n");
}
void closeQueue(struct Queue* queue){
struct QueueNode* next = NULL;
while(queue->priorNode){
next = queue->priorNode->nextNode;
free(queue->priorNode);
if(!next) break;
queue->priorNode = next;
}
free(queue);
}
int main(){
struct Queue* queue = initQueue();
enqueue(queue,15);
enqueue(queue,4);
enqueue(queue,8);
enqueue(queue,13);
enqueue(queue,7);
listQueue(queue);
peekQueue(queue);
struct QueueNode node;
node = dequeue(queue);
printf("\"%d\" came out of the queue\n",node.data);
node = dequeue(queue);
printf("\"%d\" came out of the queue\n",node.data);
node = dequeue(queue);
printf("\"%d\" came out of the queue\n",node.data);
node = dequeue(queue);
printf("\"%d\" came out of the queue\n",node.data);
node = dequeue(queue);
printf("\"%d\" came out of the queue\n",node.data);
node = dequeue(queue);
printf("\"%d\" came out of the queue\n",node.data);
closeQueue(queue);
return 0;
}
I especially didn't know what to do in my dequeue
function when the queue was empty. I don't want the 0 to be returned as well because that would of course be confusing to the user.