2013-01-15 178 views
0

我一直遇到很多鏈接列表函數和C函數,它們打算傳遞雙指針來代替指向函數的單指針。例如下面的函數用於鏈表中的排序插入:作爲函數參數的雙指針

void sortedinsert(struct node **headref,struct node *newnode) 
    { 
      while(*headref!=NULL&&(*headref)->data<newnode->data) 
        headref=&((*headref)->next); 
      newnode->next=headref; 
      *headref=newnode; 
    } 

請給我解釋一下關於地方單一指針使用雙指針作爲函數參數的,它是如何簡化了書寫功能上面鏈表?

+0

我不知道你在問什麼。你能以問題的形式來說這個嗎? – BlackVegetable

+1

http://c-faq.com/ptrs/passptrinit.html – hmjd

+1

在C參數中按值傳遞。當你傳遞一個指針時,只傳遞指針的一個副本。所以如果你想改變調用者的原始指針,就會傳遞一個雙指針。 –

回答

0

注意,如果你使用C++,你可以通過引用headref,所以相同的代碼會更簡單。它完全相同的事情,但它更簡單:

void sortedinsert(struct node* &headref,struct node *newnode) 
    { 
      while(headref!=NULL && headref->data < newnode->data) 
        headref = headref->next; 
      newnode->next = headref; 
      headref = newnode; 
    } 
2

這個「雙指針」是一個指向指針的指針。當更新列表頭項時,它允許來電者的指針副本由sortedinsert函數更新。

*headref=newnode;更新調用者的指針指向newnode。 (順便說一句,我認爲代碼是可疑的。它看起來像headref總是被設置爲newnode,無論列表中的位置newnode的插入的。)

請注意,您可避免使用一個指向這個指針通過改變函數來返回指向列表頭部的指針。

0

sortedinsert函數接受指向指向列表頭部的指針和指向新節點的指針的指針。

該列表的頭部只是一個指針,但是該函數中的「指向指針的指針」,因爲該函數正在更改列表頭部的位置。

新節點被添加到列表中的排序位置,並且頭似乎總是被修改爲指向最新的節點。