似乎我无法弄清楚为什么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: 当我进入第二个条目时弹出窗口。
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;
}
}
答案 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)
除了尝试插入已存在的名称时显而易见的内存泄漏,您的代码似乎工作正常。当0
或NULL
用于初始化指针时,它工作正常。没什么区别。
(我可以猜测的是,在你的实际调用代码中(你没有显示),你以某种方式设法通过值传递你的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
才能正确分组您的对帐单。