#include <iostream>
using namespace std;
class IntNode {
public:
IntNode(int dataInit = 0, IntNode* nextLoc = nullptr);
void InsertAfter(IntNode* nodeLoc);
IntNode* GetNext();
void PrintNodeData();
private:
int dataVal;
IntNode* nextNodePtr;
};
// Constructor
IntNode::IntNode(int dataInit, IntNode* nextLoc) {
this->dataVal = dataInit;
this->nextNodePtr = nextLoc;
}
/* Insert node after this node.
* Before: this -- next
* After: this -- node -- next
*/
void IntNode::InsertAfter(IntNode* nodeLoc) {
IntNode* tmpNext = nullptr;
tmpNext = this->nextNodePtr; // Remember next
this->nextNodePtr = nodeLoc; // this -- node -- ?
nodeLoc->nextNodePtr = tmpNext; // this -- node -- next
}
// Print dataVal
void IntNode::PrintNodeData() {
cout << this->dataVal << endl;
}
// Grab location pointed by nextNodePtr
IntNode* IntNode::GetNext() {
return this->nextNodePtr;
}
int main() {
IntNode* headObj = nullptr; // Create IntNode pointers
IntNode* nodeObj1 = nullptr;
IntNode* nodeObj2 = nullptr;
IntNode* nodeObj3 = nullptr;
IntNode* currObj = nullptr;
// Front of nodes list
headObj = new IntNode(-1);
// Insert nodes
nodeObj1 = new IntNode(555);
headObj->InsertAfter(nodeObj1);
nodeObj2 = new IntNode(999);
nodeObj1->InsertAfter(nodeObj2);
nodeObj3 = new IntNode(777);
nodeObj2->InsertAfter(nodeObj3);
// Print linked list
currObj = headObj;
while (currObj != nullptr) {
currObj->PrintNodeData();
currObj = currObj->GetNext();
}
return 0;
}
我无法准确解读这段代码的含义以及它应该如何工作。我目前对C++语法的理解似乎不正确。上面的代码生成一个链表,最后一个节点的指针值指向包含下一个节点的值的内存块。
首先,节点本身的声明没有任何意义,并且与标准变量声明(如
)相比是不寻常的int number;
据我了解, int main () 中声明的节点是由默认构造函数定义的。每当调用默认构造函数时,都会初始化 dataVal 和 nextNodePtr 的不同实例。 dataVal 初始化为 0,nextNodePtr 初始化为 null。
void IntNode::InsertAfter(IntNode* nodeLoc) {
IntNode* tmpNext = nullptr;
tmpNext = this->nextNodePtr; // Remember next
this->nextNodePtr = nodeLoc; // this -- node -- ?
nodeLoc->nextNodePtr = tmpNext; // this -- node -- next
插入代码对我来说没有任何意义。我不知道我应该如何准确地解释这一点
据我所知,这是一个创建 tmpNext 变量并为其赋值 null 的成员函数。在这种情况下,我看不到 this-> 的意义。 InsertAfter 函数采用特定的节点对象,每次调用该函数时都会创建一个 tmpNext 节点,并为其分配一个 null 值。然后为 tmpNext 分配放入函数的特定 Node 对象的 nextNodePtr 值,该值应为 null。
如果 headObj 被插入到函数中,则 nextNodePtr 的 nullptr 值将被分配给 headObj。那么 headObj 指向它自己吗?我也不知道如何阅读下一行。
提及您关于 headObj 的问题,我认为下一行
nodeLoc->nextNodePtr = tmpNext;
将新节点(nodeLoc)的 nextNodePtr 指针设置为下一个临时存储节点(tmpNext)。这一步至关重要,因为它将新节点正确连接到链表,而不会中断链的流动。本质上,在当前节点与其下一个节点之间插入新节点后,这一行恢复了新节点与当前节点之后原来的节点之间的链接,确保链表仍然正确链接。