理解C++中指针到指针和链表背后的逻辑(绘图节点)

xzv2uavs  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(145)

我还在努力理解指针、绘制节点和所有的东西,但我似乎不能理解一些东西。
例如,这里有一个函数,它应该从列表中删除具有偶数值的节点

void delete_even()
{
    node **p= &head;

    while (*p)
    {
        if ((*p)->data % 2 == 0)
        {
           node *nextptr=*p;

           *p=(*p)->next;
           delete nextptr;
        }
        else
        {
            p= &(*p)->next;
        }
    }
}

据我所知,p指向名为head的指针,head指向第一个节点。
如果我只写p,我说的是p所指向的东西,在这里是指针头,如果我写*p,我说的是p所指向的东西,还有一个数据,在这里是第一个节点。
假设我们有一个有4个节点的链表。同样p是一个指针的指针,所以它应该总是指向一个指针,而不是一个节点。1.现在,while (*p)(在英语中的意思是:只要p指向的东西和多一个数据解引用)
我把*看作是层次,*的意思是返回指针变量中保存的地址的值,如果它只是p,指针看指针所指向的东西,如果它是*p,做同样的事情,但是多一个层次,所以在这种情况下是第一个节点?
查看列表,我们看到第一个节点是1,它不是偶数,所以我们使用if语句的以下部分:p= &(*p)->next; In英语(通过解引用和然后获取该值的下一个成员的地址,使p指向=的东西指向第一个节点。
A)我不确定p = ~to something~是否会使p所指向的对象改变其值2.这会使两个指针都指向第二个节点。并且头指针移动了,我认为这是不对的... B)或者p = ~to something~使指针p指向其他对象2.1
在这个例子中,我们将遵循Python 2.1的方法,现在第二个节点是2,并且是偶数,创建一个新的指针nextptr,并使它指向*p所指向的对象,*p当前指向next指针,而next指向第二个节点。
然后我们让*p当前指向的东西是next数据成员,它包含第一个节点的第二个节点的地址,并使=指向第二个节点的下一个节点(即第三个节点的地址)。3
我的逻辑和绘画正确吗?因为这是我试图理解的

dgtucam1

dgtucam11#

注意-head是一个全局变量。它可以作为一个参数传递,并返回head的更新值。
最初:

head = pointer to the first node
node**p = &head : p = ptr to head

如果第一个节点值为偶数,则:

node *nextptr=*p; : nextptr = ptr to first node 
(*p) = (*p)->next : head = ptr to second node
delete nextptr    : delete first node

否则如果第一节点值不是偶数

p = &(*p)->next; : p = ptr to (first node.next)
                    so that *p updates first node.next if second node even
                    and head remains pointer to first node

相关问题