队列入队功能,如果没有

时间:2018-09-16 21:26:54

标签: c queue

我有一个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);
}

1 个答案:

答案 0 :(得分:0)

由于if (queue->last_item == NULL)应该消失,因此请确保queue->last_item永远不会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