こんにちは私は*first
を指すリンクリストをクリアする関数を作成しようとしています。次に、ノード**first
を解放し、ポインタ*first
をに設定する必要がありますNULL
。
ダブルポインタを把握するのに問題があり、これを正しく機能させることができません。
こんにちは私は*first
を指すリンクリストをクリアする関数を作成しようとしています。次に、ノード**first
を解放し、ポインタ*first
をに設定する必要がありますNULL
。
ダブルポインタを把握するのに問題があり、これを正しく機能させることができません。
ノードを削除する前に、次のリスト要素に移動する必要があります。それ以外の場合は、解放されたメモリにアクセスしています。
while( *first != NULL )
{
temp = *first;
*first = temp->next;
free(temp);
}
リスト全体を破棄しているため、*first
最終的にはNULLになることに注意してください。したがって、(のようにtemp
)シングルポインタを使用してリストをトラバース*first = NULL
し、最後に設定することができます。これにより、余分なポインターの間接参照が節約されます。この場合、CPUが無駄になることは間違いありません。
[編集]私が意味するのは:
struct node *curr = *first;
struct node *prev;
while( curr != NULL )
{
prev = curr;
curr = curr->next;
free(prev);
}
*first = NULL;
一般に、ポインターの間接参照が少ないほど、コードが一目で理解しやすくなります。
node* remove_node(node **double_pointer,int search_value)
//pass head of your node as a parameter to double pointer
{while(*double_pointer && **(double_pointer).value!=search_value)
{
double_pointer=&((**double_pointer)->next);
}
if(**double_pointer!=null)
{//lines below are to delete the node which contains our search value
node* deleted_node=*double_pointer;
*double_pointer=*double_pointer->next;
return deleted node;
}}