2016-10-20 9 views
0

私はリンクリストコードを練習しています。以下はそのための挿入機能である:私はvoidを返す場合元の値は参照渡し中に変更されませんか?

Node* insert_at_pos(Node *head, int pos){  
    struct Node *ptr=NULL; 
    printf("enter data\n"); 
    ptr=(Node*) malloc(sizeof(Node)); 
    scanf("%d",&ptr->data); 
    ptr->next=NULL; 
    if (pos==0){ 
     if (head==NULL){ 
      head=ptr; 
      return head; //return that I want to remove 
     } 
    } 
    printf("done\n"); 
} 

代わりNode*を返すので、私は私が参照によって渡した値ですので、このコードはまだ動作するはずだと思います。したがって、headの値は返さずに自動的に更新されますが、Node*を削除してvoidを返品タイプinsert_at_posに設定すると機能しません。

そして、私はこのようなinsert_at_pos関数を呼び出しています::

Node *head=insert_at_pos(head,0); 

可能性のある説明または何ここで間違って起こっている可能性があり何?

+2

[Cで関数に渡されたポインタを変更するにはどうすればよいですか?](http://stackoverflow.com/questions/766893/how-do-i-modify-a-pointer -th-of-a-c-in-a-c-in-c-in-c) –

+1

はい、それは間違いなく[どのように私はCで関数に渡されたポインタを変更しますか?](http:// stackoverflow .com/questions/766893/how-do-i-modify-a-pointer-of-a-of-a-function-in-c) –

答えて

2

この問題を処理する基本的に2つの方法があります。ポインタのアドレスを渡すか(タイプNode**、パス&head)、別のリストタイプを作成します。

第二の溶液は次のようになります。

typedef struct List { 
    Node *head; 
} List; 

新しい空のリストは、このように作成することができます。

List *list = malloc(sizeof (List)); 
list->head = NULL; 

どちらの方法が細かいです。概念的には、第2の解決策は、リストをデータノードから区別するので、実際の問題によく一致する。リストハンドルを変更することなく、リストを作成したり、値を追加または削除することができます。

最初の解決策は、リストヘッドをリストハンドルにすることによって、リストの別のエンティティをスキップします。その問題は、空のリストにはノードがないため、空のリストはNULLで示されるということです。これは、リストが空から空でないか空でないから空に変化するときにリストハンドルが変化することを意味します。したがって、アイテムを挿入または削除すると、リストハンドルが変更される可能性があります。

最初のソリューションを使用して、インサート機能は、次のように宣言することができます。

void insert(Node **head, int value); 

呼び出しは次のようになります。

Node *head = null; 
insert(&head, 42); 

またはそれはあなたの質問のように(このように宣言することができ):

Node* insert(Node *head, int value); 

と、このように呼ばれる:

Node *head = null; 
head = insert(head, 42); 
+0

これは動作しています。ありがとう!しかし、なぜ私が使用しているコードが間違っているのか説明してください。概念的には? –

+1

@SamarYadavそれは間違っているわけではありません、それを行う別の方法です。私はリストが空から空でないときに挿入/削除が変わった理由を説明しました。 –

関連する問題