C ++:虽然循环不会以NULL结尾,但是我错过了什么?

时间:2014-02-13 06:21:17

标签: c++ loops while-loop linked-list terminate

似乎我无法弄清楚为什么while循环不会终止。

它应该是while(null)。

我无法理解。

所有帮助将不胜感激:D

我不知道什么可能会阻止while循环?它表示存储第一个条目,下一个条目是0x0000000000和???名字和??? ??? coords所以它实际上是NULL。我尝试在构造函数中添加next = 0;而不是next = NULL,它仍然不起作用。

谢谢你们。

安东尼

EDIT:  Value of nodePtr = 00000000 if next = 0 in the constructor
       Value of nodePtr = 00899FE0 if next = NULL in the constructor
if adding a cout << nodePtr->next; before the while.

http://pastebin.com/7usYdfHB - 完整的参考计划。

EDIT2: http://i.imgur.com/fKCoSjV.png 当我进入第二个条目时弹出窗口。

void LinkedList::appendNode(string name, double x, double y)
{
        ListNode* newNode; // To point to new node
        ListNode* nodePtr; // To traverse List

        // allocate new node
        newNode = new ListNode(name, x, y);

        // If no head, head is the newNode
        // else traverse the list to find the end and append newNode
        if (!head)
        {
                head = newNode;
                cout << "Record inserted successfully.\n" << endl;
        }
        else
        {
                nodePtr = head;

                //traverse the list loop
                while (nodePtr->next) //VS 2012 locks up here <-----
                {

                        //Checks for duplicate entry by name
                        if (nodePtr->cityName == name)
                        {
                                cout << "No need to insert again, as this record exists in the existing data set.\n" << endl;
                                return;
                        }
                        //traverse the list
                        nodePtr = nodePtr->next;
                }
                // checks 2nd entry, as while loop wont run for a 2nd entry.
                if (nodePtr->cityName == name)                  {
                        {
                                cout << "No need to insert again, as this record exists in the existing data set.\n" << endl;
                                return;
                        }
                }
                // if next is NULL add newNode
                else if (!nodePtr->next)
                {
                        nodePtr->next = newNode;
                        cout << "Record inserted successfully.\n" << endl;
                }
        }

2 个答案:

答案 0 :(得分:1)

我试图重现你的问题但不能。我反向设计了ListNode和LinkedList类。以下代码有效,也许可以帮助您解决问题。我稍微重构了一下以简化它(进一步你应该考虑跟踪列表的结尾,因为这将有助于你的列表需要的其他操作)。确保为LinkedList类实现析构函数以清理节点。

#include <string>
#include <iostream>

using namespace std;

struct ListNode
{
    string cityName;
    double m_x, m_y;
    ListNode* next;

    ListNode(string name, double x, double y) : cityName(name), m_x(x), m_y(y), next(nullptr)
    {}
};

class LinkedList
{
    ListNode* head;
public:
    LinkedList() : head(nullptr)
    {
    }
    ~LinkedList()
    {
    }
    void LinkedList::appendNode(string name, double x, double y)
    {
        ListNode* newNode; // To point to new node

        // allocate new node
        newNode = new ListNode(name, x, y);

        // If no head, head is the newNode
        // else traverse the list to find the end and append newNode
        if (!head)
        {
            head = newNode;
            cout << "Record inserted successfully.\n" << endl;
        }
        else
        {
            ListNode *nodePtr = head;
            ListNode *prevNode = nullptr;

            //traverse the list loop
            while (nodePtr)
            {

                //Checks for duplicate entry by name
                if (nodePtr->cityName == name)
                {
                    cout << "No need to insert again, as this record exists in the existing data set.\n" << endl;
                    return;
                }
                //traverse the list
                prevNode = nodePtr;
                nodePtr = nodePtr->next;
            }
            // if next is NULL add newNode
            if (prevNode)
            {
                prevNode->next = newNode;
                cout << "Record inserted successfully.\n" << endl;
            }
        }
    }
};

int main()
{
    LinkedList list;

    list.appendNode("New York", 1.0, 2.0);
    list.appendNode("Boston", 1.5, 2.5);
    list.appendNode("Miami", 1.7, 2.7);
    list.appendNode("Miami", 1.7, 2.7);
}

答案 1 :(得分:1)

除了尝试插入已存在的名称时显而易见的内存泄漏,您的代码似乎工作正常。当0NULL用于初始化指针时,它工作正常。没什么区别。

(我可以猜测的是,在你的实际调用代码中(你没有显示),你以某种方式设法通过值传递你的LinkedList 。从你的{ {1}}不符合三法则,列表的完整性受到侵犯,导致您观察到的不确定后果。)

BTW,通过使用额外的间接级别,您可以将重度分支的LinkedList函数简化为更紧凑且几乎无分支的函数

appendNode

(我也消除了泄漏。)具体来说,这种技术可以避免编写专用分支来处理头节点。

(参考代码的完整版本),在“按坐标删除”组的功能中,您出于某种原因检查两者 void LinkedList::appendNode(string name, double x, double y) { ListNode** pnodePtr; for (pnodePtr = &head; *pnodePtr != NULL; pnodePtr = &(*pnodePtr)->next) if ((*pnodePtr)->cityName == name) break; if (*pnodePtr == NULL) { *pnodePtr = new ListNode(name, x, y); cout << "Record inserted successfully.\n" << endl; } else cout << "No need to insert again, as this record exists in the existing data set.\n" << endl; } 和头节点的x坐标,但只有列表中其他节点的一个坐标。为什么?这很奇怪,似乎没有多大意义。同时,“按坐标搜索”组的功能没有这个问题 - 它们一致地处理所有节点。

,您的y函数在一开始就会遇到迷路displayList,这就是为什么它从不打印任何东西。您需要添加一对return才能正确分组您的对帐单。