我有一个关于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="