考虑以下列表:
[LinkNode * head - LinkNode * node1 - LinkNode * node2]
我正在创建一堆FIFO。 我调用pop(),我想弹出node1。
LinkNode::LinkNode(int numIn) {
this->numIn = numIn;
next = null;
}
.
.
.
int LinkNode::pop() {
Link * temp = head->next;
head = temp->next;
int popped = head->nodeNum;
delete temp;
Return numOut;
问题:
1)head应该是指针还是LinkNode *?
2)在调用堆栈上创建Link * temp,弹出结束时不自动临时删除?
3)我的主要困惑在于temp-> next的价值是什么?这是否指向node1.next,它等于node2?
感谢您的帮助?
我的参考是Weiss的C ++ for Java Programmers。
答案 0 :(得分:1)
LinkNode *
是一个指针。所以我不确定你在问什么。new
),则需要释放它(调用delete
)答案 1 :(得分:1)
实现链接列表,树或其他链接数据结构以将实现分离为封装对象(LinkedList,Tree等)和节点对象(LinkedListNode,TreeNode等)时,通常很有用一个实现有问题的实际节点之外的方法。从节点弹出的问题是弹出的节点变得无效。将节点封装在一些较大的数据结构中允许该数据结构在外部执行弹出,从而移除旧节点。
另一件需要考虑的事情是,如果没有剩下要弹出的项目,pop会如何表现。它应该抛出异常吗?它应该只是导致未定义的行为吗?
在典型的链表中,封装类通常维护一个指向第一个元素的指针,一个元素个数的整数计数,以及一个指向最后一个元素的指针(用于将常量时间插入到列表末尾) 。要实现堆栈,只需要指向列表前面的单个指针。
自动销毁局部变量;但是,它是您的指针,它是一个局部变量,而不是它指向的项目。如果没有显式删除,指针指向的项将不会被释放。
在您的pop代码中,实际上是删除了太多项目。它应该是:
int result = head->nodeNum; // extract the result LinkNode* tmp = head; // save this so we can delete it head = head->next; // move the head forward to the next item delete tmp; // deallocate previous head return result;
此外,在尝试弹出之前,不要忘记检查头是否为非空。
答案 2 :(得分:-1)
这里有很好的参考图片。非常好的视觉效果。