指向C中单链表指针的指针



我有一个关于C中有符号链表的问题。我创建了一个链表,代码如下:

#include <stdio.h>
#include <stdlib.h>
struct node 
{
    int data;
    struct node* next;
};
struct node *mknode(int data)
{
    struct node* np=malloc(sizeof(struct node));
    np->data=data;
    np->next=NULL;
    return np;
}
struct node * insert (struct node* list,int data)
{
    struct node *np;
    struct node*curr=list;
    struct node* prev=NULL;
    np=mknode(data);
    for(;curr &&data<curr->data;curr=curr->next )
        prev=curr;

    np->next=curr;
    if(prev)
        prev->next=np;
    else
        list=np;
    return list;
}

int main()
{
    struct node* head;
    head=malloc(sizeof(struct node));
    head=insert(head,7);
    head=insert(head,2);
    head=insert(head,4);
    printf("%d",head->data);
    printf("%d",head->next->data);
    printf("%d",head->next->next->data);
    return 0;
}

然而,当我在网上搜索时,我意识到,双指针是用来创建链表的,而不是普通的指针。我的意思是,struct node **list,而不是struct node * list。我想知道为什么?哪一个是正确的,如果两者都是真的,它们之间的区别是什么,我在这里写的示例main中使用了我的实现,它工作得很好,但我不知道为什么要使用指针对指针?提前谢谢。

有些人之所以使用指向指针的指针,是为了在不返回新指针的情况下更新节点。在您的示例中,如果您想更改head指针,则必须创建一个新指针,然后使head等于该指针。使用双指针,您只需要释放第二个指针指向的空间,然后将第二个指示器更新到新的数据结构,从而保持原始的头指针

我只是在实现中使用单个指针。

阅读此处,通过这种方式,您可以在不创建新元素的情况下更改元素。

在链表中添加节点时使用双指针的原因是什么?

给定

struct node { int x; };
struct node **pplist;
struct node *plist;

pplist是指向指向struct node的指针的指针,而plist是指向struct node的指针。要更改x,您需要编写

*pplist->x = 3;
plist->x = 4;

如果您希望同一个变量指向不同的列表,或者如果您希望将指针传递给具有更改指针副作用的函数,则可以使用指向指针的指针。

这对我来说非常好。

指针只是指向某个地方的内存地址。双指针只是指向另一个内存地址的内存地址,该地址指向某些数据。

也许你可以发布你看到node **list的地方,我们可以更好地解释它,但现在,你的代码看起来不错。

如果调用"head=NULL;insert(&head,data);",则head指向第一个元素,这有点自然。所有用于更改内容的函数都应该被间接调用。但是:这是一个编码惯例的问题。有些人喜欢热,有些人喜欢冷。头的问题=插入(头,数据);是的,当您忘记"head="

时,该头不可用

相关内容

  • 没有找到相关文章