gpt4 book ai didi

C++:虽然循环不会以 NULL 终止,我是否遗漏了什么?

转载 作者:行者123 更新时间:2023-11-28 02:57:01 24 4
gpt4 key购买 nike

我似乎想不通为什么 while 循环不会终止。

本质上应该是while(null)

我想不出来

所有帮助将不胜感激:D

我根本不知道什么可能会停止 while 循环?它表示第一个条目已存储,下一个条目位于 0x0000000000 和 ???名字和??? ???坐标所以它实际上是 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 -- 完整程序供引用。

编辑2: http://i.imgur.com/fKCoSjV.png是我去输入第2条时的弹窗。

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;
}
}

最佳答案

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

(我可以做出的一个大胆猜测是,在您的实际调用代码(您未显示)中,您以某种方式设法通过 按值 传递了您的 LinkedList。由于您的 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;
}

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

此外(指代码的完整版本),在“按坐标删除”组的函数中,由于某种原因你检查两者 xy 头节点的坐标,但只有 一个 列表中其他节点的坐标。为什么?这很奇怪,似乎没有多大意义。同时,“按坐标搜索”组中的函数没有这个问题 - 它们一致地处理所有节点。

另外,您的displayList 函数在一开始就有一个杂散的return,这就是它从不打印任何东西的原因。您需要添加一对 {} 以正确分组您的语句。

关于C++:虽然循环不会以 NULL 终止,我是否遗漏了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21746704/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com