循环链表中二级指针使用问题
小甲鱼视频中线性表12讲循环链表的初始化程序,我改了下,就是把void ds_init(node **pNode)换成void ds_init(node *phead),链表就出错了1.这是小甲鱼的程序
int main()
{
node *pHead = NULL;
ds_init(&pHead);
printf("\n");
printf("%d",pHead->data);
}
void ds_init(node **pNode)
{
int item;
node *temp;
node *target;
printf("输入结点的值,输入0完成初始化\n");
while(1)
{
scanf("%d", &item);
fflush(stdin);
if(item == 0)
return;
if((*pNode) == NULL)
{ /*循环链表中只有一个结点*/
*pNode = (node*)malloc(sizeof(struct CLinkList));
if(!(*pNode))
exit(0);
(*pNode)->data = item;
(*pNode)->next = *pNode;
}
else
{
/*找到next指向第一个结点的结点*/
for(target = (*pNode); target->next != (*pNode); target = target->next)
;
/*生成一个新的结点*/
temp = (node *)malloc(sizeof(struct CLinkList));
if(!temp)
exit(0);
temp->data = item;
temp->next = *pNode;
target->next = temp;
}
}
}
2.改调二级指针的程序
node * ds_init(node *pHead)
{
int item;
node *temp;
node *target;
while(1)
{
printf("输入结点的值(输入0时完成初始化)\n");
fflush(stdin);
scanf("%d",&item);
if (item == 0)
{
return;
}
if (pHead == NULL)
{/*循环链表只有一个节点*/
pHead = (node *)malloc(sizeof(struct CLinklist));
if (!pHead)
{
exit(0);
}
pHead->data = item;
pHead->next = pHead;
}
else
{
/*找到next指向的第一个节点的结点*/
for (target = pHead;target->next != pHead;target = target->next)
{
;
}
temp = (node *)malloc(sizeof(struct CLinklist));
if (!temp)
{
exit(0);
}
temp->data = item;
temp->next = pHead;
target->next = temp;
}
}
return pHead;
}
int main()
{
node *pHead = NULL;
ds_init(pHead);
printf("\n");
printf("%d",pHead->data);
}
指针的指针,第1个指针存的是指针类型的地址。后面一个指针存的是结构类型的地址。 void ds_init(node ** pNode)
这样定义函数,可以通过 pNode 参数返回一个指向 node 节点的指针变量,只要这样操作就可以了:
* pNode = ptr ;
其中,ptr 是指向 node 结构的指针
void ds_init(node * phead)
如果这样定义,就只能访问和修改由 phead 指向的 node 节点的各个字段,无法返回一个指向 node 节点的指针。 jackz007 发表于 2019-11-10 22:17
这样定义函数,可以通过 pNode 参数返回一个指向 node 节点的指针变量,只要这样操作就可以了:
...
还是有点疑问,这个对循环链表的操作,我的理解是只需要知道头结点就好了,不需要指向头结点的指针 扼言abc 发表于 2019-11-11 18:12
还是有点疑问,这个对循环链表的操作,我的理解是只需要知道头结点就好了,不需要指向头结点的指针
如果想在函数中修改结构数据,不可以传入节点,必须传入指向节点的指针,除非你并不打算修改数据。 jackz007 发表于 2019-11-11 18:22
如果想在函数中修改结构数据,不可以传入节点,必须传入指向节点的指针,除非你并不打算修改数据 ...
好像有点明白了,但是我在单链表中的操作一直传递的都是head头结点,那为什么成功了?
是因为head中并没有数据,只是指向第一个节点,而这个例子中phead就直接存储数据了,请问是这样的吗? 扼言abc 发表于 2019-11-11 19:21
好像有点明白了,但是我在单链表中的操作一直传递的都是head头结点,那为什么成功了?
是因为head中并没 ...
我验证了,确实这个错误,非常感谢您的点拨
页:
[1]