我试图从简单的优先级队列中理解这个C代码,尤其是 - 为什么它需要struct qnode **first
部分:
int quedel(struct qnode **first, struct qnode **last, int *prio, int *val) {
struct qnode *tmp = NULL;
if((NULL == *last) && (*last == *first)) {
fprintf(stderr, "Empty queue.....\n");
return -1;
}
*val = (*first)->data, *prio = (*first)->prio;
tmp = *first, *first = (*first)->next;
if(*last == tmp)
*last = (*last)->next;
free(tmp);
return 0;
}
答案 0 :(得分:2)
由于队列本身是通过指针(到struct qnode
s)处理的,并且因为您希望quedel
具有其first
和last
元素的引用语义,所以使用通常的C语言来实现引用语义,方法是将指针传递给你想要引用的东西 - 而指向struct qnode
的指针就是一个双指针。
quedel
函数的要点是修改调用者范围内的实际变量,因为它删除了队列的头部并将调用者的原始头指针更改为指向新头部(或尾部)的新指针,或者以这种方式为止的方式):
{
struct qnode * q = new_queue(); // or whatever
add_lots_of_elements(q); // fine; the head doesn't change,
// only its contents do
quedel(&q); // now q is something else!
}
答案 1 :(得分:2)
由于C没有pass-by-reference,只有pass-by-value,这种方法是进行此分配的唯一方法:
*first = (*first)->next;
来电者可以看到。
(如果first
只是一个指针,我们写了first = first->next
,那么调用此函数的代码将看不到修改。)