/* Rebecca Dreezer Sample Assignment 3B Adaptation of Dr Farmer's code */ #include #include #include #define MAX_LENGTH 10 typedef int nat; typedef struct { char data[20]; nat id; } element; typedef struct { element contents[MAX_LENGTH]; nat length; nat front; nat back; } queue_record; typedef queue_record * queue; /* Primitive operators */ queue bottom() { queue newQ = malloc(sizeof(queue_record)); newQ->length = 0; newQ->front = 0; newQ->back = 0; return newQ; } nat length(queue q) { return q->length; } element front(queue q) { nat queue_len = q->length; if (queue_len == 0) { printf("\nError: the queue is empty!\n"); element e1 = {"/", 0}; return e1; } else { return q->contents[q->front]; } } void pop(queue q) { nat queue_len = q->length; if (queue_len == 0) { printf("Error in pop: queue is empty.\n"); return; } else { q->front = q->front + 1; q->length = queue_len - 1; return; } } void push(element e, queue q) { nat queue_len = q->length; if (queue_len == MAX_LENGTH) { printf("Error in push: queue is full.\n"); } else { q->back = q->back + 1; q->contents[queue_len] = e; q->length = queue_len + 1; } return; } void print(queue q) { nat queue_len = q->length; nat i; nat j = q->front; printf("queue contents: ["); for (i = 0; i < queue_len; i++) { if (i + 1 == queue_len) printf("%s %d", q->contents[j].data, q->contents[j].id); else printf("%s %d,", q->contents[j].data, q->contents[j].id); j++; } printf("].\n"); } void dismantle(queue q) { free(q); return; } /* Derived Operators */ bool is_empty (queue q) { return length(q) == 0; } void reset (queue q) { while (!is_empty(q)) { pop(q); } } /* Main function */ int main() { element e0 = {"a", 1}; element e1 = {"b", 2}; element e2 = {"c", 1}; element e3 = {"d", 2}; element e4 = {"e", 1}; element e5 = {"f", 2}; element e6 = {"g", 1}; element e7 = {"h", 2}; element e8 = {"i", 1}; element e9 = {"j", 2}; queue q = bottom(); print(q); front(q); pop(q); push(e0,q); print(q); element e = front(q); printf("Front is [%s %d].\n", e.data, e.id); push(e1,q); print(q); push(e2,q); print(q); push(e3,q); print(q); push(e4,q); print(q); push(e5,q); print(q); push(e6,q); print(q); push(e7,q); print(q); push(e8,q); print(q); push(e9,q); print(q); push(e0,q); print(q); pop(q); pop(q); print(q); reset(q); print(q); dismantle(q); print(q); return 0; }