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

指向C中单链表指针的指针,c,pointers,linked-list,C,Pointers,Linked List,我对C中的signly链表有一个问题。我创建了一个链表,代码如下所示: #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;

我对C中的signly链表有一个问题。我创建了一个链表,代码如下所示:

#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;
}
#包括
#包括
结构节点
{
int数据;
结构节点*下一步;
};
结构节点*mknode(int数据)
{
结构节点*np=malloc(sizeof(结构节点));
np->data=数据;
np->next=NULL;
返回np;
}
结构节点*插入(结构节点*列表,整数数据)
{
结构节点*np;
结构节点*curr=列表;
结构节点*prev=NULL;
np=mknode(数据);
对于(;curr&&datadata;curr=curr->next)
上一次=当前;
np->next=当前;
如果(上一个)
上一个->下一个=np;
其他的
列表=np;
退货清单;
}
int main()
{
结构节点*头部;
head=malloc(sizeof(结构节点));
头部=插入件(头部,7);
头部=插入件(头部,2);
头部=插入件(头部,4);
printf(“%d”,头部->数据);
printf(“%d”,head->next->data);
printf(“%d”,head->next->next->data);
返回0;
}

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

我觉得这个很好

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


也许你可以把你看到的
node**list
贴到哪里,我们可以更好地解释它,但是现在,你的代码看起来不错

我觉得这个很好

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


也许你可以把你看到的
node**list
贴到哪里,我们可以更好地解释它,但是现在,你的代码看起来不错

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


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

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


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

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

时,该head是不可用的,如果您调用“head=NULL;insert(&head,data);”,那么head会指向第一个元素。所有用于更改内容的函数都应该被间接调用。
但是:这是一个编码约定的问题。有些人喜欢热的,有些人喜欢冷的。head的问题=插入(head,数据);也就是说,当您忘记“head=“

阅读此处”时,该head是不可用的,这样您就可以在不创建新元素的情况下更改元素


阅读此处,这样您就可以在不创建新图元的情况下更改图元

给定

struct node { int x; };
struct node **pplist;
struct node *plist;
plist
是指向
struct节点的指针,而
plist
是指向
struct节点的指针。要更改x,您需要编写

*pplist->x = 3;
plist->x = 4;
如果希望同一个变量指向(例如)不同的列表,或者希望将指针传递给函数,从而产生更改该指针的副作用,则可以使用指向指针的指针。

struct node { int x; };
struct node **pplist;
struct node *plist;
plist
是指向
struct节点的指针,而
plist
是指向
struct节点的指针。要更改x,您需要编写

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

如果希望同一个变量指向(例如)不同的列表,或者希望将指针传递给函数,而改变该指针会产生副作用,则可以使用指向指针的指针。

head=malloc(sizeof(struct node))头未正确初始化。@彼得米尔我不认识您在这里链接的问题。很抱歉重复,但我没有重复,重复目的
head=malloc(sizeof(struct node))
head未正确初始化。@PeterMehle我不认识您在此处链接的问题。很抱歉重复,但我没有重复。mknode函数完全相同,但这里是使用双指针的insert函数:mknode函数完全相同,但这里是使用双指针的insert函数: