【问题标题】:Queue Enqueue function with no if没有 if 的队列入队函数
【发布时间】:2018-09-16 21:26:54
【问题描述】:

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

【问题讨论】:

    标签: c queue


    【解决方案1】:

    既然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

    【讨论】:

    • 但是我还是要初始化first_item(也就是head),只有在queening第一个item的时候,这才是这里的“if”的真正意义,换个说法可能就清楚了更新示例中的代码
    猜你喜欢
    • 1970-01-01
    • 2022-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    相关资源
    最近更新 更多