首页 > 解决方案 > 没有 if 的队列入队函数

问题描述

我有一个 Enque 方法版本,我被要求重写它,不带“if”(或三元运算符)。无法转动我的头。任何帮助表示赞赏。

int QueueEnqueue(queue_t *queue, void *data)
{
    s_node_t *new_item = SListCreateNode(data, NULL);

    if (new_item == NULL)
    {
        return (1);
    }

    if (queue->last_item == NULL) /* this one should go away somehow*/
    {
        queue->last_item = queue->first_item      = new_item;
    } else {
        queue->last_item = queue->last_item->next = new_item;
    }

    return(0);
}

[更新] 替代实现

int QueueEnqueue(queue_t *queue, void *data)
{
    s_node_t *new_item = SListCreateNode(data, NULL);

    if (new_item == NULL)
    {
        return (1);
    }

    if (queue->last_item == NULL) /* this one should go away somehow */
    {
        queue->first_item      = new_item;
    } else {
        queue->last_item->next = new_item;
    }

    queue->last_item =  = new_item;

    return(0);
}

标签: cqueue

解决方案


既然if (queue->last_item == NULL)应该消失,请确保那queue->last_item是 never NULL。实现它的最简单方法是使用虚拟头检测队列:

    typedef struct {
        s_node_t dummy; // Notice it is not a pointer
        s_node_t * last_item;
    } queue_t;

    queue_t * QueueCreate() {
        queue_t * queue = malloc(sizeof(queue_t));
        queue->last_item = &queue->dummy;
        return queue;
    }

    QueueEnqueu(queue_t * queue, void * data) {
        new_item = ....;
        queue->last_item->next = new_item;
        queue->last_item = new_item;
    }

显然,QueueDequeue应该返回dummy->next。我还建议使用tail而不是last_item.


推荐阅读