【问题标题】:A function in C to `push` items to a queueC 中将项目“推送”到队列的函数
【发布时间】:2016-06-09 14:17:26
【问题描述】:

用 C 写一个push(Queue **, Nod *) 方法。想检查我在将nods 推送到queue 时是否涵盖了基础知识。

void push_back(Queue ** q, Process * p){
    p->next = NULL;
    if( (*q)->head == NULL && (*q)->tail ==NULL){
        (*q)->head = (*q)->tail = p;
    }
    (*q)->tail->next = p->next;
    (*q)->tail = p;
}

我是否通过正确分配p->nextNULL 分配给(*q)->tail->next

【问题讨论】:

  • 这里传递一个指向Queue的指针的原因是什么?你不会在任何地方重新分配q,所以它只是发生了无用的重定向。
  • 我认为指向指针的指针可以让我编写一个不需要将指针返回给调用者的函数
  • 如果你像push_back(&some_queue, some_process) 一样调用它,那么你就是在模拟按引用调用,这是一种可以重新分配作为第一个参数传递的指针的方法。然后你可以在函数中做*q = some_other_queue。由于您不这样做,因此您不需要额外的重定向。
  • 有趣 - 我会试试看
  • C 不支持方法。它不是 OOP 语言。

标签: c queue


【解决方案1】:

(*q)->tail->next 应该已经是NULL

如果队列不为空,则您无法正确链接新节点。相反,如果队列不为空,您应该让(*q)->tail->next 指向p,然后让尾部指向p

if (/* queue is empty */)
{
    ...
}
else
{
    (*q)->tail->next = p;
    (*q)->tail = p;
}

正如我在我的 cmets 中所说,您似乎不需要通过将指针传递给指针来创建额外的间接,这意味着您可以将它(通过我的更改)重写为

void push_back(Queue * q, Process * p){
    p->next = NULL;
    if( q->head == NULL && q->tail ==NULL){
        q->head = q->tail = p;
    } else {
        q->tail->next = p;
        q->tail = p;
    }
}

【讨论】:

  • 我想到了这个解决方案,但(*q)->tail->next = p 如何使tail 指向NULL(*q)->tail->next是指向p的地址还是自动指向p->next,即NULL
  • @user5985774 但是您不需要 尾部是空指针。当您分配 q->tail = p 之后,q->tail->next 将是 NULL,因为 p->nextNULL。尝试在纸上画出列表,并在头部和尾部添加新节点,看看它是如何完成的。
  • @JJL 另外,您如何让当前的尾部下一个指针指向新的尾部(即p)?
  • 感谢您的建议,但在我的情况下,我正在初始化一个指向队列的指针,例如Queue *ready_queue,我发现在 C 中我将指针传递给队列的唯一方法不返回值的方法是使用 ** 并添加该间接。有什么想法吗?我是通过初始化指向队列对象的指针来创建这种间接的吗?
  • @JJL 仅对您实际执行分配的功能执行此操作。在您的 push_back 函数中,您不需要它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多