鱼C论坛

 找回密码
 立即注册
查看: 2995|回复: 6

[已解决]循环链表中二级指针使用问题

[复制链接]
发表于 2019-11-10 21:03:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
小甲鱼视频中线性表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);
         
                  
     

}

最佳答案
2019-11-11 18:22:33
扼言abc 发表于 2019-11-11 18:12
还是有点疑问,这个对循环链表的操作,我的理解是只需要知道头结点就好了,不需要指向头结点的指针

        如果想在函数中修改结构数据,不可以传入节点,必须传入指向节点的指针,除非你并不打算修改数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-10 21:59:30 From FishC Mobile | 显示全部楼层
指针的指针,第1个指针存的是指针类型的地址。后面一个指针存的是结构类型的地址。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-10 22:17:07 | 显示全部楼层
void ds_init(node ** pNode)
        这样定义函数,可以通过 pNode 参数返回一个指向 node 节点的指针变量,只要这样操作就可以了:
        * pNode = ptr ;
        其中,ptr 是指向 node 结构的指针
void ds_init(node * phead)
        如果这样定义,就只能访问和修改由 phead 指向的 node 节点的各个字段,无法返回一个指向 node 节点的指针。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-11 18:12:27 | 显示全部楼层
jackz007 发表于 2019-11-10 22:17
这样定义函数,可以通过 pNode 参数返回一个指向 node 节点的指针变量,只要这样操作就可以了:
...

还是有点疑问,这个对循环链表的操作,我的理解是只需要知道头结点就好了,不需要指向头结点的指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-11 18:22:33 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
扼言abc 发表于 2019-11-11 18:12
还是有点疑问,这个对循环链表的操作,我的理解是只需要知道头结点就好了,不需要指向头结点的指针

        如果想在函数中修改结构数据,不可以传入节点,必须传入指向节点的指针,除非你并不打算修改数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-11 19:21:24 | 显示全部楼层
jackz007 发表于 2019-11-11 18:22
如果想在函数中修改结构数据,不可以传入节点,必须传入指向节点的指针,除非你并不打算修改数据 ...

好像有点明白了,但是我在单链表中的操作一直传递的都是head头结点,那为什么成功了?
是因为head中并没有数据,只是指向第一个节点,而这个例子中phead就直接存储数据了,请问是这样的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-14 09:33:41 | 显示全部楼层
扼言abc 发表于 2019-11-11 19:21
好像有点明白了,但是我在单链表中的操作一直传递的都是head头结点,那为什么成功了?
是因为head中并没 ...

我验证了,确实这个错误,非常感谢您的点拨
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 05:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表