2016-02-26 51 views
3

使用C編寫push(Queue **, Nod *)方法。想要檢查我是否已經將nods推到queue上的基礎知識。C中的函數將`items`推送到隊列中

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->next分配NULL(*q)->tail->next

+0

這是什麼原因傳遞指向'隊列'的指針在這裏?你不會在任何地方重新分配'q',所以它只是無用的重定向發生。 –

+0

我認爲指向指針的指針可以讓我編寫一個函數,不需要返回指針回調用者 – JJL

+0

如果你把它叫做'push_back(&some_queue,some_process)',那麼你正在模擬* call by引用*這是一種方式,因此您可以重新分配作爲第一個參數傳遞的指針。那麼你可以在函數中做'* q = some_other_queue'。既然你不這樣做,你不需要額外的重定向。 –

回答

3

(*q)->tail->next應該已經是NULL

如果隊列不是空的,那麼你不能正確鏈接新節點。相反,如果隊列不爲空,你應該讓(*q)->tail->nextp,然後使尾部點p

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

正如我在我的評論說,你似乎並不需要額外的通過傳遞一個指針指向一個指針,這意味着你可以改寫它(與我的更改),因爲

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; 
    } 
} 
+0

我想到了這個解決方案,但是'(* q) - > tail-> next = p'如何使tail指向NULL?是否(* q) - > tail-> next指向p的地址,還是自動指向'p-> next',它是'NULL'? – JJL

+0

@ user5985774但是你不需要*尾部是一個空指針。當你分配'q-> tail = p'之後'q-> tail-> next'將會是'NULL',因爲'p-> next'是'NULL'。嘗試在紙上繪製列表,並在頭部和尾部添加新節點,以瞭解它是如何完成的。 –

+0

@JJL另外,你還會如何使當前尾部的下一個指針指向新的尾部(即「p」)? –