2017-10-05 75 views
0

我有以下結構:迭代列表LST和函數f施加到每一個環節,以建立一個「新鮮」的名單

typedef struct s_list 
{ 
    void *content; 
    void content_size; 
    struct s_list *next; 
} t_list; 

我試圖創建一個函數:

t_list *lstmap(t_list *lst, t_list *(*f)(t_list *elem)); 

該遍歷所述t_listLST」,應用功能「˚F」到每個元件的每個元素,並返回一個新的帶有新鮮元素的t_list

起初,我嘗試以下方法:

tmp = f(lst); 
first = tmp; 
while(lst) 
{ 
    tmp = f(lst); 
    tmp = tmp->next; 
    lst = lst->next; 
} 

,沒有工作。

然後,迭代這樣的時候:

tmp = f(lst); 
first = tmp; 
while (lst->next) 
{ 
    tmp->next = f(lst->next); 
    tmp = tmp->next; 
    lst = lst->next; 
} 

它的工作。

爲什麼它們的結果不同?

+1

新清單需要新節點指向新內容。這些必須佔據某種記憶。這個記憶從哪裏來? –

+0

此函數的常用通用名稱是[map](https://en.wikipedia.org/wiki/Map_(higher-order_function))。 – unwind

+0

答案取決於你f()以及事實上,如果你打算返回一個新的列表副本或修改一個現有的列表。 – dbrank0

回答

2

在您的第一個循環中,您從未將任何內容分配給tmp->next,因此結果列表永遠不會生成。此外,作業tmp = f(lst);將覆蓋前一次迭代中的tmp = tmp->next;的結果(可能沒有明確定義/初始化)。

0
tmp = f(lst); 
first = tmp; 
while(lst) 
{ 
    tmp = f(lst); 
    ... 

您的值分配給tmp,然後立即另一個值賦給tmp。因此第一個賦值沒有效果,除了該值也保存在first中。所以這個片段相當於

first = f(lst); 
while(lst) 
{ 
     tmp = f(lst); 
     .... 

但是first然後沒有鏈接到任何其他項目。實際上沒有任何項目與任何其他項目鏈接。因此整個循環除了創建和遺忘某些節點以外,沒有任何效果,從而泄漏內存。

相關問題