Ejemplo n.º 1
0
/*
   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;
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
/*
   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;
}