Queue
This commit is contained in:
parent
2b6b07a3e0
commit
8081cf3951
81
queue.c
Normal file
81
queue.c
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
|
||||
typedef struct node {
|
||||
void *content;
|
||||
struct node *next;
|
||||
}Node;
|
||||
|
||||
typedef struct queue {
|
||||
Node *first;
|
||||
Node *last;
|
||||
size_t w;
|
||||
}Queue;
|
||||
|
||||
Queue *new_queue(size_t w) {
|
||||
Queue *q = malloc(sizeof(Queue));
|
||||
q->first = NULL;
|
||||
q->last = NULL;
|
||||
q->w = w;
|
||||
return q;
|
||||
}
|
||||
|
||||
bool is_empty(Queue *q) {
|
||||
return !q->first;
|
||||
}
|
||||
|
||||
void enqueue(void *content, Queue *q) {
|
||||
Node *n = malloc(sizeof(Node));
|
||||
n->content = content;
|
||||
n->next = NULL;
|
||||
if (is_empty(q))
|
||||
q->first = n;
|
||||
else
|
||||
q->last->next = n;
|
||||
q->last = n;
|
||||
}
|
||||
|
||||
void *dequeue(Queue *q) {
|
||||
if (is_empty(q))
|
||||
return NULL;
|
||||
void *r = q->first->content;
|
||||
Node *n = q->first;
|
||||
q->first = q->first->next;
|
||||
free(n);
|
||||
if (is_empty(q))
|
||||
q->last = NULL;
|
||||
return r;
|
||||
}
|
||||
|
||||
void destroy(Queue *q) {
|
||||
while (!is_empty(q)) {
|
||||
free(dequeue(q));
|
||||
}
|
||||
free(q);
|
||||
}
|
||||
|
||||
int main() {
|
||||
Queue *q = new_queue(sizeof(int));
|
||||
int *a = malloc(sizeof(int));
|
||||
int *b = malloc(sizeof(int));
|
||||
int *c = malloc(sizeof(int));
|
||||
int *d = malloc(sizeof(int));
|
||||
*a=1;
|
||||
*b=2;
|
||||
*c=3;
|
||||
*d=-1;
|
||||
enqueue(a, q);
|
||||
printf("%d\n", *((int*)dequeue(q)));
|
||||
enqueue(b, q);
|
||||
enqueue(c, q);
|
||||
enqueue(d, q);
|
||||
while(!is_empty(q)) {
|
||||
printf("%d\n", *((int*)dequeue(q)));
|
||||
}
|
||||
destroy(q);
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user