c - 没有 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);
}
解决方案
既然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
.
推荐阅读
- c# - 如何获取列条目之一相同的行数
- java - 错误 RetroFit 开始数组对象 .IllegalStateException
- html - Angular 4中div背景图像的占位符
- c# - 单元测试 - 有时有效,有时无效
- c# - 我没有收到响应 REST API (POST) 内容类型 FormUrlEncode
- android - 向 REST 身份验证端点发送凭据时如何处理密码安全问题?
- c# - C# MVC 从 DB 导出到 excel 。合并单元格
- regex - 使用正则表达式捕获 JSON 属性名称
- java - Jenkins 安装插件中的问题
- vba - 在一行上有两个语句