Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 116 additions & 0 deletions LinkedQueue.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
#include<stdlib.h>
#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;
}
32 changes: 32 additions & 0 deletions LinkedQueue.h
Original file line number Diff line number Diff line change
@@ -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);
7 changes: 1 addition & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -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
68 changes: 68 additions & 0 deletions Test Queue.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
#include<stdio.h>
#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;
}