2016-08-03 6 views
-3

私はポインタの仕組みを知っています。なぜ* headの代わりに** headが使用されていますか?

私はこのよう作業と、彼らは

deleteNode(struct node **head_ref, int key); 

も正しいを使用していたが、そうする理由があるhttp://quiz.geeksforgeeks.org/linked-list-set-3-deleting-node/ここに@、第一1に障害が発生しますされ

deleteNode(struct node *head_ref, int key); 

と同様の問題をやっどんな状態であってもかまわない。

struct linked_list *deleteNode(struct linked_list *head, int key) 
{ 
struct linked_list *prevNode,*current,*temp; 

if(head==NULL) 
    return head; 


if(head->data==key) 
{ 
if(head->next==NULL) 

{ free(head); 
     return NULL; 
} 

else 
temp=head->next; 

free(head); 
return temp; 

} 
prevNode= head; 
current=head->next; 


printf("\n %d\n",(current->data)); 

while((current!=NULL) && (current->data!=key)) 
{ printf("\n here"); 

prevNode= current; 

current=current->next; 
} 


if(current==NULL){ 
    printf("\n element not present in list !\n"); 
return head; 
      } 

if(current->next==NULL) 

prevNode->next=NULL; 


else 
prevNode->next=current->next; 

free(current); 
return head; 
} 



head=deleteNode(head,key); 
+0

1つはポインタで、もう1つはポインタへのポインタです。 – Siguza

+0

(関数内から)オブジェクトを変更するには、そのオブジェクトへのポインタが必要です。オブジェクトがポインタの場合は、ポインタへのポインタが必要です。期間。 – wildplasser

答えて

1

削除する必要がある場合ヘッドノードを変更できないため、最初の機能は動作しません。 2番目の関数は、ヘッドノードのアドレスを取るため、必要に応じて変更することができます。リンクで

deleteNode機能には、次のものが含まれています

struct node* temp = *head_ref, *prev; 

// If head node itself holds the key to be deleted 
if (temp != NULL && temp->data == key) 
{ 
    *head_ref = temp->next; // Changed head 
    free(temp);    // free old head 
    return; 
} 

あなたはそれが指すものを変更するにはhead_refを参照解除することをここで見ることができます。

+0

これは正しいですか?もし新しい頭部を返せば。 (更新を参照) – neileap

+0

@neileapはい、正しいです。 – dbush

1

リンクリストを忘れて、変数の更新を考えてみましょう。それを行うには2、同様に有効な方法があります。

// 1. pass back 
int update_int1(int val) { 
    return val + 1; 
} 

void caller1() { 
    int var = 1; 
    var = update_int1(var); 
} 

// 2. write back 
void update_int2(int *val) { 
    *val += 1; 
} 

void caller2() { 
    int var = 1; 
    update_int2(&var); 
} 

これは理解しやすいので、のは、ポインタと同じことをしてみましょう:

// 1. pass back 
char *update_ptr1(char *ptr) { 
    return ptr + 1; 
} 

void caller1() { 
    char *ptr = malloc(10); 
    ptr = update_ptr1(ptr); 
} 

// 2. write back 
void update_ptr2(char **ptr) { 
    *ptr += 1; 
} 

void caller2() { 
    char *ptr = malloc(10); 
    update_ptr2(&ptr); 
} 

それは、intの場合とまったく同じ動作します!鍵は、いつもがもう1つあります。返信したい場合は、スターです。

どのパターンを選択するかはあなた次第です。ライトバックアプローチは、リンクされたリストで一般的です。

0

enter image description here

あなたはBに含まれるアドレスの* bの==>のアクセス内容を書き込みます。

書くとき** c ==> cに含まれるアドレスの内容の内容にアクセスします。

関連する問題