2017-10-05 9 views
0

を作成するために、各リンクに関数fを適用し、私は次の構造を持っている:反復し、リストLSTと「新鮮」リスト

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_list「 LST 」、各要素に「 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

回答はあなたに依存します。リストの新しいコピーを返すか、既存のリストを修正する予定がある場合は、事実にもよります。 – 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に相当します。実際、他のアイテムにリンクされているアイテムはありません。したがって、ループ全体は、いくつかのノードを作成したり忘れたりしてメモリが漏れてしまうことを除いて、何の効果もありません。

関連する問題