void *Q_DelCur(queue *q) { void *d; datanode *n, *p; if (q->cursor == NULL) return NULL; if (q->cursor == q->head) return Q_PopHead(q); if (q->cursor == q->tail) return Q_PopTail(q); n = q->cursor->next; p = q->cursor->prev; d = q->cursor->data; free(q->cursor); if (p != NULL) q->cursor = p; else q->cursor = n; q->size--; q->sorted = False_; return d; }
void *Q_Iter_Del(queue *q, q_iter iter) { void *d; datanode *n, *p; if(!q) return NULL; if(iter == NULL) return NULL; if(iter == (q_iter)q->head) return Q_PopHead(q); if(iter == (q_iter)q->tail) return Q_PopTail(q); n = ((node*)iter)->next; p = ((node*)iter)->prev; d = ((node*)iter)->data; efree(iter); if(p) { p->next = n; } if (q->cursor == (node*)iter) { if (p) { q->cursor = p; } else { q->cursor = n; } } if (n != NULL) { n->prev = p; } q->size--; q->sorted = False_; return d; }
void Q_Destroy(queue *q) { while(!Q_IsEmpty(q)) { Q_PopHead(q); } }