1

ここまでで、ノードを開始する 2 つの方法を見ましたか?

  1. Node c={6, NULL};
    Node b={3, &c};
    Node a={1, &b};
    Node *root = &a;
    
  2. Node * new_Node = (Node*)malloc(sizeof(Node));
    new_Node->data = 10;
    new_Node->next = &m;
    

どちらが良いですか?そして、どれが正しいですか?

もう 1 つの質問は、メモリを解放する方法です。

1 の場合、mem を解放する必要はありませんよね?

2 の場合、次のポインター 、free(root->next)root->data=NULLこれはノードを削除する正しい方法ですか?

4

2 に答える 2

2

#1の場合、メモリを解放する必要はありません。ローカル変数はスタックにあります。

free(root->next)

それはすべてを解放するわけではありません。これにより、1 つのノードのみが解放されます。

どちらが優れているわけでも、正しいわけでもありません。それはあなたがしようとしていることに依存します。決定要因は、プログラムの実行を開始する前に作成するオブジェクトの数を知っているかどうかです。そうすれば、#1 (スタック上にローカル変数を作成する) で問題ありません。たとえば、ノード数が 100 を超えることがないと確信している場合は、サイズ 100 のノードの配列を作成できます。

Node NodeList[100];

事前にサイズがわからない場合は、malloc/free を使用してヒープ上のノードを管理する必要があります。

于 2013-08-23T05:23:04.173 に答える
2

どちらも正しいです。最初のものはスタック上のオブジェクトのインスタンス化に依存し、それらを に割り当てNode *、後でヒープ上のオブジェクトをインスタンス化します ( を使用malloc)。

freemalloc によって割り当てられたメモリを解放するために使用できます。

あなたは最初のケースで正しいです - mem を解放する必要はありません。

2番目のケース - リンクされたリスト - を渡す無料のラッパーを作成し、Node **NULLノードを取得するまでリンクされたリストをトラバースし、次のノードを保存してfreeから現在のノードを保存します。最後に、必要に応じて、引数を として設定できますNULL

于 2013-08-23T05:20:40.997 に答える