こんにちは私は*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;
}}