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