Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "queue.h"
- // Functions
- void queue_initialize(queue *q, data_string to_string, data_destroy destroy) {
- q->capacity = QUEUE_SIZE;
- q->values = malloc(sizeof(data) * q->capacity);
- assert(q->values != NULL);
- q->front = 0;
- q->rear = 0;
- q->size = 0;
- q->to_string = to_string;
- q->destroy = destroy;
- return;
- }
- void queue_destroy(queue *q) {
- int i;
- for (i = 0; i < q->size; i++) {
- q->destroy(&q->values[i]);
- }
- free(q->values);
- q->values = NULL;
- q->capacity = 0;
- q->front = 0;
- q->rear = 0;
- q->size = 0;
- return;
- }
- int queue_empty(const queue *q) {
- return q->size == 0;
- }
- int queue_full(const queue *q) {
- // Assume queue is not full.
- assert(q->size < q->capacity);
- return 0;
- }
- void queue_insert(queue *q, data v) {
- q->rear = (q->rear + 1) % q->capacity;
- if (q->size == q->rear) {
- q->capacity <<= 1;
- q->values = realloc(q->values, sizeof(data) * q->capacity);
- }
- q->values[q->rear] = v;
- q->size++;
- return;
- }
- data queue_peek(const queue *q) {
- // Cannot peek on an empty queue.
- assert(q->front != -1);
- return q->values[q->front];
- }
- data queue_remove(queue *q) {
- // Cannot remove on an empty queue.
- assert(q->front != -1);
- data v = q->values[q->front];
- q->front = (q->front + 1) % q->capacity;
- q->size--;
- return v;
- }
- void queue_print(const queue *q) {
- // Iterate through the queue.
- char string[MAX_LINE];
- int j = q->front;
- for (int i = 0; i < q->size; i++) {
- printf("%s\n", q->to_string(string, MAX_LINE, &(q->values[j])));
- j = (j + 1) % q->capacity;
- }
- printf("\n");
- return;
- }
- void queue_combine(queue *target, queue *source1, queue *source2) {
- while (source1->size > 0 && source2->size > 0) {
- queue_insert(target, queue_remove(source1));
- queue_insert(target, queue_remove(source2));
- }
- while (source1->size > 0) {
- queue_insert(target, queue_remove(source1));
- }
- while (source2->size > 0) {
- queue_insert(target, queue_remove(source2));
- }
- return;
- }
- void queue_split(queue *target1, queue *target2, queue *source) {
- int i = 0;
- while (source->size > 0) {
- if (i % 2 == 0) {
- queue_insert(target1, queue_remove(source));
- } else {
- queue_insert(target2, queue_remove(source));
- }
- i++;
- }
- return;
- }
- int queue_identical(queue *q1, queue *q2) {
- int identical = 0;
- int i = 0;
- if (q1->size != q2->size) {
- identical = 1;
- } else {
- while (identical == 0 && i < q2->size) {
- if (movie_compare(&q1->values[i], &q2->values[i]) != 0) {
- identical = 1;
- } else {
- i++;
- }
- }
- }
- return identical;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement