C++ 函数返回linkedlist C++;

C++ 函数返回linkedlist C++;,c++,linked-list,C++,Linked List,正在尝试在我的linkedlist类中实现一个函数,该函数将返回列表中存储的数据总量。i、 e.linkedlist的5、10、20个总数将返回35个 My node类包含getNextPtr和getData方法 我实现了一个新节点,将其称为currentPtr,并将其指向headPtr 编译时,我得到:“36请求currentPtr中的非类类型的成员getNextPtr” 38和40是相同的,38是currentPtr中的getData 不太确定我错过了什么 int LinkedList::g

正在尝试在我的linkedlist类中实现一个函数,该函数将返回列表中存储的数据总量。i、 e.linkedlist的5、10、20个总数将返回35个

My node类包含getNextPtr和getData方法

我实现了一个新节点,将其称为currentPtr,并将其指向headPtr

编译时,我得到:“36请求currentPtr中的非类类型的成员getNextPtr”

38和40是相同的,38是currentPtr中的getData

不太确定我错过了什么

int LinkedList::getTotal()
{
    int total = 0;

    Node *currentPtr = headPtr;

(36)    while(currentPtr.getNextPtr() != NULL)
    {
(38)        total += currentPtr.getData();

(40)        currentPtr = currentPtr.getNextPtr();
    }

    return total;
}
我们的想法是遍历链表,直到它到达tailptr,tailptr将指向null,将它遇到的任何数据添加到总数中


希望这有点道理,提前感谢:)

currentPtr
是指针,而不是类类型(对象)。使用
->
访问其成员,而不是

while (currentPrt->getNextPtr()) { ...

currentPtr
是指针,而不是类类型(对象)。使用
->
访问其成员,而不是

while (currentPrt->getNextPtr()) { ...

如果要取消引用指针,则需要使用
->
,而不是

e、 g.您的代码变成:

while(currentPtr != NULL)
{
   total += currentPtr->getData();
   currentPtr = currentPtr->getNextPtr();
}

我还发现编写
while(currentPtr)
(即“while I have a valid pointer”)比显式测试
NULL

更自然,如果您想取消引用指针,则需要使用
->
,而不是

e、 g.您的代码变成:

while(currentPtr != NULL)
{
   total += currentPtr->getData();
   currentPtr = currentPtr->getNextPtr();
}

我还发现编写
while(currentPtr)
(即“while I have a valid pointer”)比显式测试
NULL
更自然,因为代码
节点*currentPtr…
声明了指向节点的指针。 通过指针访问对象的成员变量或函数时- 与这里的情况一样,您需要取消对指针的引用

在您的情况下,这意味着将
成员访问器替换为
->

因此,您的代码应该如下所示:

while(currentPtr->getNextPtr() != NULL)
{
    total += currentPtr->getData();

    currentPtr = currentPtr->getNextPtr();
}

代码
节点*currentPtr…
声明指向节点的指针。 通过指针访问对象的成员变量或函数时- 与这里的情况一样,您需要取消对指针的引用

在您的情况下,这意味着将
成员访问器替换为
->

因此,您的代码应该如下所示:

while(currentPtr->getNextPtr() != NULL)
{
    total += currentPtr->getData();

    currentPtr = currentPtr->getNextPtr();
}

首先,你应该使用
->
而不是

其次,您的代码有一个小错误。如果到达最后一个节点,则它是
next
NULL
,但该节点仍有您忽略的数据。(因为如果
ptr->next==NULL
,则不进入while。也就是说,您应该将条件更改为
ptr!=NULL

我建议使用以下代码之一:

如果在列表的开头有一个虚拟节点(虚拟节点是一个没有数据的节点,仅在列表的开头)

如果没有虚拟节点,它只是有点不同:

int LinkedList::getTotal()
{
    int total = 0;
    Node *currentPtr = headPtr;
    while (currentPtr != NULL)  // or simply while (currentPtr)
    {
        total += currentPtr->getData();
        currentPtr = currentPtr->getNextPtr();
    }
    return total;
}

首先,你应该使用
->
而不是

其次,您的代码有一个小错误。如果到达最后一个节点,则它是
next
NULL
,但该节点仍有您忽略的数据。(因为如果
ptr->next==NULL
,则不进入while。也就是说,您应该将条件更改为
ptr!=NULL

我建议使用以下代码之一:

如果在列表的开头有一个虚拟节点(虚拟节点是一个没有数据的节点,仅在列表的开头)

如果没有虚拟节点,它只是有点不同:

int LinkedList::getTotal()
{
    int total = 0;
    Node *currentPtr = headPtr;
    while (currentPtr != NULL)  // or simply while (currentPtr)
    {
        total += currentPtr->getData();
        currentPtr = currentPtr->getNextPtr();
    }
    return total;
}

我认为您的问题在于使用“.”来引用成员。您的
currentPtr
是一个指针,因此您应该使用
->
,例如
while(currentPtr->getNextPtr()!=NULL)
P.S.在以后的问题中,最好使用注释(
/
)在您希望突出显示的行上,以便人们可以将您的代码复制并粘贴到他们的环境中。我认为您的问题在于使用“.”引用成员。您的
currentPtr
是一个指针,因此您应该使用
->
,例如
while(currentPtr->getNextPtr()!=NULL)
P.S.在以后的问题中,最好使用注释(
/
)在您希望突出显示的行上,以便人们可以将您的代码复制并粘贴到他们的环境中。非常感谢:)以及其他帖子:)请确保将while条件更改为
currentpr!=NULL
而不是
currentPtr->getNextPtr()!=空
。现在的情况是,您忽略了链表的最后一个节点,这是一个bug(请参阅我对这个问题的回答),非常感谢:)以及其他帖子:)请确保将while条件更改为
currentPtr!=NULL
而不是
currentPtr->getNextPtr()!=空
。现在的情况是,你忽略了链表的最后一个节点,这是一个bug(参见我的回答这个问题)终止条件问题的好地方非常感谢Shahbaz:)这帮助很大,因为当我测试代码时,我遇到了一个分段错误,很高兴我回来重新阅读答案,非常大的帮助:)非常感谢Shahbaz:)这非常有帮助,因为当我测试代码时,我遇到了一个分段错误,很高兴我回来重新阅读答案,非常大的帮助:)