2016-11-02 6 views
-1

Cのリンクキュー構造から要素を削除するために、このリンクされたキューコードが与えられました。通常はこれを別に実装しますが、このコードは再帰を使用しています。それは、それがやるべきことをするのだろうか、なぜですか?それができない場合は、修正する方法はありますか?私はこの再帰的な事に対して本当に新しいです。ありがとう!Cで再帰的にリンクされたキューから削除

typedef struct telement T; 
struct telement{ 
    int value; 
    T* next; 
}; 

void Out (T **A){ 
    if ((*A)->next == NULL){ 
     printf("\n --I'm removing element with value %d.---", (*A)->value); 
     (*A) = NULL; 
     free(*A); 
    } 
    else{ 
     Out(&(*A)->next); 
    } 
} 
+0

どうすればよいですか?それがコーヒーを作ることになっているなら、それはそれをしません。 – immibis

+0

@immibisフォワードリンクリストの最後のノードまで再帰的に移動し、そのノードを指しているポインタをNULLに設定し、ヌルポインタを解放してメモリをリークします。要するに、可能な限り最小限の*効率的な方法でタスクを実行することは、再帰とポインターツーポインターの使用法です。また、空の(ヌルポインター)キューで実行されるとき、未定義の動作を呼び出すことも保証されています。 – WhozCraig

+0

@WhozCraigそれは私が尋ねたものではありません。私のコメントを読んでください。 – immibis

答えて

2

この関数は、最後の要素を削除します。再帰の最後のステップでは、Aはリストの先頭ポインタまたは最後から2番目の要素のnextポインタのいずれかを指すことに注意してください。

次に、このポインタをNULLに設定して、最後の要素をリストからリンク解除します。

ただし、free(NULL)は何もしないため、最後の要素は解放されません。

+0

あなたは*それを解決する方法の答えを提供するかもしれません* – chqrlie

関連する問題