我被要求使用沒有頭節點的鏈表來實作佇列。我的老師給了我們這個片段來參考入隊功能。我熟悉如何使用佇列操作。但是當雙指標與函式一起使用時,我總是感到困惑。在大多數情況下,我不確定雙指標指向哪個變數。我想知道 Node ** list 是什么意思。
任何幫助或解釋表示贊賞
這是我提到的片段
void insertNode(Node * prev,int x) {
Node * new = (Node *) malloc(sizeof(Node));
new->val = x;
new->next = prev->next;
prev->next = new;
}
void enqueue(Node ** list, int x) {
Node * new = (Node *) malloc(sizeof(Node));
if (isEmpty(*list)) {
*list = new;
(*list)->val = x;
(*list)->next = NULL;
}
else {
new = *list;
while (new->next != NULL)
new = new->next;
insertNode(new,x);
}
}
uj5u.com熱心網友回復:
通常雙指標作為函式的引數用于修飾指標本身。
例子:
int a = 5;
int b = 10;
void foo(int *x)
{
x = &b;
}
void bar(int **x)
{
*x = &b;
}
int main(void)
{
int *ptr = &a;
foo(ptr);
printf("%d\n", *ptr);
bar(&ptr);
printf("%d\n", *ptr);
}
輸出:
5
10
函式bar修改指標ptr。函式foo不是因為 x 是具有函式作用域的區域變數。
uj5u.com熱心網友回復:
對于初學者來說,這個功能enqueue是錯誤的。它會產生記憶體泄漏。
首先動態分配一個節點,并將其地址分配給指標new
Node * new = (Node *) malloc(sizeof(Node));
然后指標被指標運算式的值重新賦值*list
new = *list;
所以之前動態分配記憶體的地址就丟失了。
而且功能insertNode和enqueue不安全。如果沒有為新節點分配記憶體,那么函式會呼叫未定義的行為。
這兩個函式應按以下方式宣告和定義
int insertNode( Node * prev,int x )
{
Node *new = malloc( sizeof( Node ) );
int success = new != NULL;
if ( success )
{
new->val = x;
new->next = prev->next;
prev->next = new;
}
return success;
}
和
int enqueue( Node **list, int x )
{
if ( isEmpty( *list ) )
{
Node *new = malloc( sizeof( Node ) );
int success = new != NULL;
if ( success )
{
new->val = x;
new->next = NULL;
*list = new;
}
return success;
}
else
{
Node *current = *list;
while ( current->next != NULL ) current = current->next;
return insertNode( current, x );
}
}
至于你的問題那么函式enqueue可以在lost為空的時候改變指向頭節點的指標。
所以指標必須通過參考傳遞給函式。
在 C 中,按參考傳遞意味著通過指向它的指標間接傳遞一個物件(指標也是一個物件)。因此取消參考指標,例如
*list = new;
該函式可以訪問原始物件(或指標)并可以更改其值。
否則相對于您的函式enqueue,傳遞的指標將按值傳遞。在這種情況下,該函式將處理原始指標值的副本。更改原始指標值的副本不會更改原始指標。它仍然會保持不變。它是將在函式內更改的原始指標值的副本。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/537270.html
標籤:C指针队列参考传递单链表
上一篇:如何回傳帶有函式引數的動態陣列
