1

こんにちは私は*firstを指すリンクリストをクリアする関数を作成しようとしています。次に、ノード**firstを解放し、ポインタ*firstをに設定する必要がありますNULL

ダブルポインタを把握するのに問題があり、これを正しく機能させることができません。

4

2 に答える 2

3

ノードを削除するに、次のリスト要素に移動する必要があります。それ以外の場合は、解放されたメモリにアクセスしています。

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;

一般に、ポインターの間接参照が少ないほど、コードが一目で理解しやすくなります。

于 2013-02-04T04:07:42.067 に答える
0
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;
}}
于 2016-08-01T20:40:27.127 に答える