diff --git a/LinkedQueue.cpp b/LinkedQueue.cpp new file mode 100644 index 0000000..6b5e4ce --- /dev/null +++ b/LinkedQueue.cpp @@ -0,0 +1,116 @@ +#include +#include"LinkedQueue.h" + +/* This is implemention level */ + +void CreateQueue(Queue *pq) +{ + pq->front = NULL; + pq->rear = NULL; + pq->size = 0; +} + +void Append(QueueEntry e , Queue *pq) +{ + QueueNode *pn = (QueueNode*)malloc( sizeof(QueueNode) ); + pn->next = NULL; + pn->entry = e; + if(!pq->rear) + pq->front = pn; + else + pq->rear->next = pn; + pq->rear = pn; + pq->size++; +} + +void Serve(QueueEntry *pe , Queue *pq) +{ + QueueNode *pn = pq->front; + *pe = pn->entry; + pq->front = pn->next; // change it to pq->front = pq->front->next + free(pn); + if(!pq->rear) + pq->rear = NULL; + pq->size--; +} + +int QueueEmpty(Queue *pq) +{ + return !pq->front; // try to to change it to pq->rear +} + +int QueueFull(Queue *pq) +{ + return 0; +} + +int QueueSize(Queue *pq) +{ + return pq->size; +} + +void ClearQueue(Queue *pq) +{ + while(pq->front){ + pq->rear = pq->front->next; + free(pq->front); + pq->front = pq->rear; + } + pq->size = 0; +} + +void TraverseQueue(Queue *pq , void(*pf)(QueueEntry)) +{ + QueueNode *pn; + for(pn=pq->front; pn; pn=pn->next) + (*pf)(pn->entry); +} + +QueueEntry LastElement(Queue *ps) +{ + return ps->rear->entry; +} + +QueueEntry LastElementRemoved(Queue *ps) +{ + QueueNode *pn; + QueueEntry result; + result = ps->rear->entry; + pn = ps->front; + if(pn->next == NULL){ + result = pn->entry; + free(pn); + ps->front = NULL; + return result; + } + else + { + while(pn->next->next != NULL) + { + pn = pn->next; + } + + free(ps->rear); + ps->rear = pn; + ps->rear->next = NULL; + ps->size--; + } + return result; +} + +QueueEntry FirstElement(Queue *ps) +{ + return ps->front->entry; +} + +int QueueSizee(Queue *s) +{ + int result = 0; + QueueNode *pn; + pn = s->front; + while(pn){ + result++; + pn = pn->next; + } + return result; +} \ No newline at end of file diff --git a/LinkedQueue.h b/LinkedQueue.h new file mode 100644 index 0000000..632ee0c --- /dev/null +++ b/LinkedQueue.h @@ -0,0 +1,32 @@ + +typedef char QueueEntry; + +typedef struct queuenode{ + QueueEntry entry; + struct queuenode *next; +}QueueNode; + +typedef struct queue{ + QueueNode *front; + QueueNode *rear; + int size; +}Queue; + + + + +void CreateQueue(Queue *); +void Append(QueueEntry , Queue *); +void Serve(QueueEntry * , Queue *); +int QueueEmpty(Queue *); +int QueueFull(Queue *); +int QueueSize(Queue *); +void ClearQueue(Queue *); +void TraverseQueue(Queue * , void(*pf)(QueueEntry)); +QueueEntry LastElement(Queue *ps); +QueueEntry LastElementRemoved(Queue *ps); +QueueEntry FirstElement(Queue *ps); +void DestroyQueue(Queue *ps); +void CopyQueue(Queue *src,Queue *dest); +int QueueSize(Queue *s); +int QueueSizee(Queue *s); diff --git a/README.md b/README.md index 06ae94c..0b0abaf 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,2 @@ ## DataStructures -This repository for my implemented data structure using C -I write this code when I was in college second grade at 2010 in data structure course - -+ [Stack data structure pointer based using C](https://github.com/MoustafaAttia/DataStructures/tree/StackPointerBased) -+ [Stack data structure array based using C](https://github.com/MoustafaAttia/DataStructures/tree/StackArrayBased) -+ [Queue data structure array based using C](https://github.com/MoustafaAttia/DataStructures/tree/QueueArrayBased) +### Queue using pointer based in C language diff --git a/Test Queue.cpp b/Test Queue.cpp new file mode 100644 index 0000000..49aba38 --- /dev/null +++ b/Test Queue.cpp @@ -0,0 +1,68 @@ +#include +#include"LinkedQueue.h" + + +/* This is user level */ + +void PrintQueue(QueueEntry pe) +{ + printf("%c <--",pe); +} + + +int main() +{ + printf("********************************************\n" + "This Queue is just for CHAR only \n" + "********************************************\n"); + Queue q; + int j = 0; + QueueEntry e; + char arr[10] = {'A','B','C','D','E','F','G','H','I','J'}; + CreateQueue(&q); + + for(int i=0; i<10; i++) + { + e = arr[i]; + Append(e,&q); + TraverseQueue(&q , &PrintQueue); + putchar('\n'); + } + + printf("_______________________________________________________\n"); + printf("The orignal Queue is like that : \n"); + TraverseQueue(&q , &PrintQueue); + putchar('\n'); + printf("_______________________________________________________\n"); + printf("The first element in the queue is %c: \n",FirstElement(&q)); + putchar('\n'); + + + while(!QueueEmpty(&q)) + { + Serve(&e , &q); + printf("After we Serve the elemnt number %d\n",(10-j)); + TraverseQueue(&q , &PrintQueue); + putchar('\n'); + printf("The element e = '%c'\n",e); + printf("******\nThe Size of Queue now is : %d\n", QueueSize(&q)); + printf("_______________________________________________________\n"); + j++; + } + + QueueEntry item = NULL; + Queue write; + CreateQueue(&write); + + while(item != '\n') + { + Append(item , &write); + scanf("%c",&item); + } + printf("__________________________________________________\n"); + TraverseQueue(&write , &PrintQueue); + + putchar('\n'); + + return 0; +}