/* Return the element at index in the queue, and deletes it from inside the queue. */ int q_delete_item(queue q, int index) { assert(0 <= index && index < q_length(q)); int val; if(index == 0) { q_node_t *new_head = q->head->next; val = q->head->val; free(q->head); q->head = new_head; if (q->length == 0) { q->tail = 0; } } else { q_node_t *previousNode = q_get_node(q, index - 1); q_node_t *newNext = previousNode->next->next; val = previousNode->next->val; free(previousNode->next); previousNode->next = newNext; if(previousNode->next == 0){ q->tail = previousNode; } } q->length--; return val; }
void q_add_to_rear(int fd) { q_nodeptr q_new = q_get_node(); assert(fd >= 0 && fd <= max_size); assert(q_new); DBG_Q("q_add_to_rear: adding fd %d\n", fd); q_new->fd = fd; q_new->prev = q_rear; q_new->next = NULL; assert(fd_array[fd] == NULL); fd_array[fd] = q_new; if (q_rear) { DBG_Q("q_add_to_rear old q_rear %p = %d\n", q_rear, q_rear->fd); q_rear->next = q_new; } if (q_front == NULL) { q_front = q_new; } q_rear = q_new; cur_size++; DBG_Q("q_add_to_rear: new q_rear %p = %d cur_size = %d\n", q_rear, q_rear->fd, cur_size); }
/* Get the element of the queue at position index, where the head of the queue is position 0, and the tail is at position length(q)-1 */ int q_get_item(queue q, int index) { assert(0 <= index && index < q_length(q)); return q_get_node(q, index)->val; }