は、我々は、タスクとリンクリストの構造体を与えられています利点となぜ機能を作成するときに頭にダブルポインタを使用するだろうか?リンクされたリストの先頭にシングルまたはダブルポインタ
1
A
答えて
6
head
へのポインタへのポインタを渡す理由は、ポインタhead
への変更が呼び出し側関数に見られ、関数から頭を返す必要はないということです。我々は返す代わりlist
からnew_node
を割り当てる必要がある場合は、フロント
struct Node *add_node (struct Node *list, int n){
struct Node *new_node = malloc(sizeof(struct Node));
if(new_node == NULL){
printf("Memory allocation failed\n");
exit(EXIT_FAILURE);
}
new_node->data = n;
new_node->next = list;
return new_node;
}
でリストにノードを追加する
struct Node{
int data;
struct Node *next;
};
機能:
たとえば、この単純なノードを考えます上記の関数を修正し、return文を削除して文を入れる必要があります。
list = new_node;
ただし、動作しない!
これは、Cではすべての引数と同様に、ポインタが値渡しされるためです。 つまり、list
には、add_node
関数に渡されたポインタ値のコピーが含まれ、この関数自体に渡されるポインタは含まれません。
これでポインタへのポインタが必要です。
void add_node (struct Node **list, int n){
struct Node *new_node = malloc(sizeof(struct Node));
if(new_node == NULL){
printf("Memory allocation failed\n");
exit(EXIT_FAILURE);
}
new_node->data = n;
new_node->next = *list;
*list = new_node;
}
0
あなたがdlistint_t *head
変数を使用しての代わりに、関数パラメータにdlistint_t **head
変数を使用している場合ので、その後、機能dlistint_t *add_dnodeint(dlistint_t **head, const int n);
に変数head
で行われた変更は、このメソッドにローカルになります。 Node*
を使用しているため、変数head
で行われた変更は、その関数に対してローカルです。関数呼び出し後でもこれらの変更を反映させたい場合は、dlistint_t **head
を使用します。
2
ダブルポインタを使用する場合は、頭のアドレスを渡すことができますので、関数で実際のポインタを変更できます。あなたは新しい頭を返す必要はありませんこのように。
関連する問題
- 1. リンクされたリストからトップノードを削除し、別のリンクされたリストの先頭に置く方法は?
- 2. リンクノードリンクされたリストの先頭
- 3. リンクされたリストでトラバーサルの後にリストの先頭を取得する方法は?
- 4. リンクされたリストの先頭にノードを追加するとエラーメッセージが表示されない
- 5. 入れ子にされたReactコンポーネントで "リンクされたページ"の先頭から始めるには?
- 6. リンクされたリストのcの頭のアドレスを失う
- 7. 配列またはリンクされたリスト
- 8. リストの先頭ではないキーワードによってトリガーされたスキームマクロ
- 9. リストの先頭に挿入
- 10. リンクされたリストの頭がそれ自身を指していますか?
- 11. リンクされたリスト
- 12. 優先順位の高いリンクをリストの先頭に移動するアルゴリズム
- 13. ディレクトリ内のファイルのリンク先リストが最後に追加されました
- 14. Cのリンクされたリスト
- 15. リンクされたリストのオブジェクト
- 16. リンクされたリストのヘッドノード
- 17. リンクされたリストのセグメンテーションフォールト
- 18. 先頭から先頭にレンダリングされたプレースホルダラベルを付ける方法はありますか?
- 19. 選択する配列リストまたはリンクされたリスト
- 20. Scalaの空リストの先頭
- 21. シングル|または?
- 22. スクロールバーは、非表示リンクがクリックされたときに先頭にジャンプします
- 23. 私の正規化されたパスの先頭に\\?\
- 24. プログラムの先頭に設定されたC++のメモリセマンティクスとグローバル
- 25. リンクされたリストとポインタ
- 26. リンクされたリスト構造
- 27. リンクされたリストとイテレータ
- 28. リンクされたリスト配列
- 29. Pythonでリンクされたリスト
- 30. テンプレートでリンクされたリスト
私はこのデザインに反対することを勧めます。最初と最後の "ノード"へのポインタを持つ "リスト"構造体を持つ方が良いでしょう。これにより、ノードを直接扱うのではなく、ノードを直接渡すことでリストを変更することができます – Alexander
通常は、 'bool add_dnodeint(dlistint_t ** head、int n)'とポインタ引数へのポインタと非ポインタ単純なポインタ引数と一致するポインタ戻り値( 'head = add_nodeint(head、newval)として使用される)を持つ' dlistint_t * add_nodeint(dlistint_t * head、int n) ; ')。通常は、一度に両方を実行することはありません - ポインタ引数へのポインタを使用し、ポインタ値を返します。 'const int n'は' n'がポインタではないのでかなり無意味です。 –