
Patrick B. answered 04/19/21
Math and computer tutor/teacher
#include <stdio.h>
#include <stdlib.h>
typedef struct listNode
{
char data;
struct listNode * nextPtr;
} * TListNode;
typedef struct listNode _TListNode;
typedef struct listNode ListNode;
typedef ListNode *ListNodePtr;
#define LIST_NODE_SIZE (sizeof(listNode))
typedef struct _TQueue
{
TListNode first;
TListNode last;
int count;
} * TQueue;
#define QUEUE_SIZE (sizeof(struct _TQueue))
void Queue_Init(TQueue q)
{
q->first=q->last=NULL;
q->count=0;
}
int Queue_Push(TQueue q, char chChar)
{
int iReturn=0;
TListNode newNode = (TListNode) malloc(LIST_NODE_SIZE);
if (newNode != NULL)
{
newNode->data = chChar;
newNode->nextPtr = NULL;
if (q->count==0)
{
q->first = q->last = newNode;
}
else
{
q->last->nextPtr = newNode;
q->last = q->last->nextPtr;
}
q->count++;
}
else
{
iReturn = -1;
}
return(iReturn);
}
char Queue_GetFirst(TQueue q )
{
return(q->first->data);
}
char Queue_GetLast(TQueue q)
{
return(q->last->data);
}
int Queue_Pop(TQueue q)
{
int iReturn=0;
if (q->count>1)
{
TListNode temp = q->first;
q->first = q->first->nextPtr;
free(temp);
q->count--;
}
else if (q->count==1)
{
free(q->first);
q->first=q->last = NULL;
q->count=0;
}
else
{
iReturn=-1;
}
return(iReturn);
}
void Queue_Destroy(TQueue q)
{
TListNode listNodePtr = q->first;
for (int iLoop=0; iLoop<q->count; iLoop++)
{
q->first = q->first->nextPtr;
free(listNodePtr);
listNodePtr = q->first;
}
q->first=q->last=NULL;
q->count=0;
}
Queue_Dump( TQueue q, char * strMsg)
{
if (strMsg!=NULL)
{
printf("******************************************************\n");
printf(strMsg);
}
printf("******************************************************\n");
TListNode cur = q->first;
while (cur!=NULL)
{
printf(" %c \n",cur->data);
cur = cur->nextPtr;
}
}
int main()
{
struct _TQueue queue;
char chChar;
Queue_Init(&queue);
for (chChar='A'; chChar<='Z'; chChar++)
{
Queue_Push(&queue,chChar);
}
int N = queue.count;
char strMsg[25];
sprintf(strMsg," queue count = %d \n",N);
Queue_Dump(&queue,strMsg);
for (int iLoop=0; iLoop<N; iLoop++)
{
printf(" popping %c .....\n",Queue_GetFirst(&queue));
Queue_Pop(&queue);
}
if (queue.count==0)
{
printf("DONE \n");
}
}