2014-04-28 91 views
0

?您好, 我已經實現了一個鏈接的結構,並與此做了一個列表。鏈接列表的結構,傳遞參數 - c

typedef struct link1 { 
    char* a; 
    char* b; 
    int i; 
    struct link1* next; 
}; 

我有從列表中追加,刪除等功能。這些函數獲得列表中的第一個鏈接。問題在於使用信息未更新的功能之後。 有沒有辦法傳遞第一個鏈接的參數,這樣列表會被更新? 第一個鏈接是從類型:

link1* first; 

**我試圖返回第一個鏈接,它的工作原理,但我已經嵌套函數,我不能回到在外部函數的鏈接,所以我覺得唯一的方法是以其他方式傳遞參數。

現在我送參數是這樣的:

link1* first; 
func(first); 
void func(link1* l){...} 

謝謝!

+0

請澄清,你的意思是你不能改變第一個指針? – HLL

+0

我更改從「第一個」鏈接開始的列表,但僅限於該功能。功能完成時,不保存更改。 – user3479031

+0

你需要讓你的函數接受一個指向'list *'的指針,即一個'list **',然後將'&first'傳遞給它,然後你可以修改它指向的內容。 –

回答

0

無論何時您想使用OUTBYREF參數更改函數中的任何東西,您應該發送一個指向您正在設置的值的指針。 I.E:如果您要設置int,那麼您通過int *;如果您正在分配的值的類型爲struct link1*,則應該將指針傳遞給此類型(指向結構體指針的指針),您可以在其中分配內存並設置調用函數的指針。

void init(struct link1 **top) 
{ 
    //assign the pointer of the calling function 
    *top = ...; 
} 

調用函數代碼

struct link1 *top; 
init(&top); 
+0

謝謝!很有幫助! – user3479031

1

鏈接列表操作,如追加,刪除等,必須經常影響到列表中的「頭」節點。例如,當「頭」節點被刪除時,那麼「頭 - >下一步」現在必須承擔角色作爲新的列表頭節點。在這樣的情況下,將指針

link1* first; 

(其指向列表的頭節點)必須被修改以指向「頭戴式>下一個」節點。不幸的是,首先通過這個莊園的功能

func(first); 

不允許func()來操縱'first'指向的位置。爲了FUNC()來操縱,其中「第一」是指向,則必須通過第一的「地址」到FUNC():現在

func(&first); 

,如果FUNC()執行的操作,例如「刪除節點'或‘添加節點’,它會地址‘第一’,因此它可以更改‘第一’是指向:

func(struct link1 **first); 
    { 
    ... 
    *first = head->next; 
    ... 
    } 
+0

謝謝!很好的解釋! – user3479031

0

你的問題是,你傳遞作爲一個屬性,在功能,第一個節點的數據而不是第一個節點的數據的地址。這在這種情況下如何影響我們?在第一個節點上做出的任何更改只是函數的局部變量中的更改,它們位於程序堆棧中,當函數返回時,此變量將消失,因此您所做的更改也會消失。

檢查了這一點,你可能會更好地理解它。試想一下,這是你的內存的快照和灰色的細胞內存索引和白細胞都相應的數據:

enter image description here

當你有一個像B A變量(可以稱之爲「單指針」變量),並且將b作爲屬性傳遞給函數,實際上傳遞b(0x1)的數據而不是b(0x3)的地址。考慮到這一點,您可以注意到您可以更改0x1的內容(例如,添加10並將其設置爲'30'),但不能更改0x3的內容,這正是您想要的內容。

如果您希望能夠在不返回任何東西的情況下更改列表的根目錄,則必須傳遞地址地址或「雙指針」變量,如c。它傳遞這樣你可以:

一)改變0x3時的數據:*第一= ....

二)變更爲0x1的數據:**第一= ....

如果你想檢查是否理解它,如果你想改變第一個數據,就會想要發生。例如:

int **temp = ....; 
first = temp; 

現在我們提到的理論部分,爲了追隨我的建議,你必須改變你的代碼是這樣的:

func(&first); //pass the address of first variable 
. 
. 
func(<variableType> **first) {  // receive with double star 
. 
. 
    *first = ...;     // change the root using single star 
. 
. 
} 
+0

非常感謝!現在好多了! – user3479031

+0

我很高興能幫上忙。考慮提出任何有用的答案,並接受其中一個最有幫助的答案。 – Mario