```1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 ``` ```#include #include #include #include // -------- Vorgegeben Anfang----------- typedef int Queueelement; typedef struct { /* the space to store the queue elements */ Queueelement *queuespace; /* points to entry into which element is to be enqueud */ unsigned long enqueueindex, /* last element of queue */ dequeueindex, /* size of the queue (max no_of_elements)*/ queuesize, /* no of elements between enqueueindex+1 and dequeindex */ no_of_elements; } Queue; /* The following function delivers an empty queue with a reservoir of size elements to be stored in the queue. The reservoir can, if necessary, be enlarged. */ Queue *queue_new(unsigned long queuesize); /* The following function returns true iff the queue is empty. */ bool queue_is_empty(const Queue *q); /* The following function resizes the queue by doubling the space reservoir */ void queue_double_size(Queue *q); /* The following function adds an element elem to the end of the queue. */ void queue_enqueue(Queue *q, Queueelement elem); /* The following function removes the element elem from the start of the queue. */ Queueelement queue_dequeue(Queue *q); /* print the contents of <*q> on screen */ void queue_print(const Queue *q); /* The following function frees the space required for the queue. */ void queue_delete(Queue *q); // --------- Vorgegeben Ende --------- /* The following function delivers an empty queue with a reservoir of size elements to be stored in the queue. The reservoir can, if necessary, be enlarged. */ Queue *queue_new(unsigned long queuesize) { Queue *q; q = (Queue *) malloc(sizeof(*q)); assert(queuesize > 0); q->no_of_elements = 0; q->queuesize = queuesize; q->enqueueindex = queuesize - 1; q->dequeueindex = queuesize - 1; return q; } /* The following function returns true if the queue is empty. */ bool queue_is_empty(const Queue *q) { // Ueberpruefen, ob q existiert assert(q); // Wenn keine Elemente im Queue vorhanden sind, muss dennoch ueberprueft werden // ob der Enqueueindex und der Dequeueindex beide 0 sind if (q->no_of_elements == 0) { assert((q->enqueueindex == 0) && (q->dequeueindex == 0)); return true; } return false; } /* The following function resizes the queue by doubling the space reservoir */ void queue_double_size(Queue *q) { // Vorhandener Speicher des Queues wird verdoppelt q = (Queue *) realloc (*q, sizeof(q*)*2); // Zu beachten ist, dass die Elemente nach hinten verschoben werden muessen // damit keine "Loch" entsteht } /* The following function adds an element elem to the end of the queue. */ void queue_enqueue(Queue *q, Queueelement elem) { // Falls die Anzahl der Elemente der Groesse des Queues entspricht // wird die Queuegroesse um die doppelte groesse erweitert /* if (q->no_of_elements == q->queuesize) { queue_double_size(q); } */ q->queuespace[q->enqueueindex] = elem; if (q->enqueueindex > 0) { // Den Enqueueindex vermindern, damit der richtige Index angezeigt wird q->enqueueindex--; } else { // Wenn enqueueindex <= 0 dann ist der enqueueindex = queuesize-1 // also die hinterste Stelle q->enqueueindex = q->queuesize - 1; } // erhoeht die Anzahl der Elemente um 1 q->no_of_elements++; //printf("Enqueueindex: %d", q->enqueueindex); } /* The following function removes the element elem from the start of the queue. */ Queueelement queue_dequeue(Queue *q) { // Es muss ueberprueft werden, ob Elemente vorhanden sind. assert(q->no_of_elements > 0); Queueelement elem; // FIFO charakter daher muss das zuerst abgelegte Element aus dem // Queue entfernt werden elem = q->queuespace[q->dequeueindex]; if (q->dequeueindex > 0) { q->dequeueindex--; } // Wenn der dequeueindex <= 0 ist, musst der dequeueindex auf queuesize-1 gesetzt werden else { q->dequeueindex = q->queuesize - 1; } // Verminderung der Anzahl der Elemente um 1 q->no_of_elements--; return elem; } /* print the contents of <*q> on screen */ void queue_print(const Queue *q) { int i; for(i = q->enqueueindex+1; i <= q->dequeueindex; i++) { //printf("%d", i); printf("%d \n", q->queuespace[i]); } } /* The following function frees the space required for the queue. */ void queue_delete(Queue *q) { // Speicher, dass durch die queuespace beansprucht wurde, wird freigegeben free(q->queuespace); // Speicher, dass fuer das Queue benoetigt wurde, wird freigegeben. free(q); } int main() { Queue *queue; queue = queue_new(5); queue_enqueue(queue, 0); queue_enqueue(queue, 3); queue_enqueue(queue, 2); queue_print(queue); return 0; } ```
 ```1 2 3 ``` ```In function 'queue_double_size': Line 88: error: expected expression before ')' token Line 88: error: incompatible type for argument 1 of 'realloc' ```