Функция постановки в очередь без if - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть версия метода 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 голосов
/ 17 сентября 2018

Поскольку 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...