为什么这里使用**头而不是*头?

时间:2016-08-03 21:04:15

标签: c linked-list

我知道指针是如何工作的。

我用这种方式做了类似的问题

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);

3 个答案:

答案 0 :(得分:1)

如果您需要删除头节点,第一个功能将无法正常工作,因为您无法更改头节点。第二个函数获取头节点的地址,以便在需要时可以更改。

链接中的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以更改其指向的内容。

答案 1 :(得分: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完全相同!关键是,如果你想回写而不是传回,总会有一个星。

您选择的模式取决于您。回写方法在链表中非常流行。

答案 2 :(得分:0)

enter image description here

当您编写* b ==>访问b。

中包含的地址内容时

当你写** c ==>访问c。

中包含的地址内容的内容时