2016-08-03 96 views
-3

我知道指針如何工作。爲什麼** head在這裏被用來代替* head?

我做了類似的問題,這樣

deleteNode(struct node *head_ref, int key); 

這是工作和@這裏http://quiz.geeksforgeeks.org/linked-list-set-3-deleting-node/他們已經使用

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

一個是指針,另一個是指向指針的指針。 – Siguza

+0

要改變一個對象(從一個函數內),你需要一個指向它的指針。如果該對象碰巧是一個指針,那麼您將需要一個指向指針的指針。期。 – wildplasser

回答

1

如果您需要刪除e頭節點,第一個功能將不起作用,因爲您不能更改頭節點。第二個函數使用頭節點的地址,因此如果需要可以更改它。

鏈路中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

讓我們忘記鏈接列表,只是想到更新變量。有兩個,同樣有效的方式來做到這一點:

// 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!關鍵是總有多一個明星,如果你想回信,不回傳。

您選擇的模式取決於您。回寫方法在鏈接列表中很受歡迎。

0

enter image description here

當你寫* B保存在b地址==>訪問內容。

當你寫** c ==>訪問c中包含的地址內容的內容。

相關問題