【发布时间】:2017-07-31 22:24:07
【问题描述】:
我有以下两个函数,它们根本不会改变我的链表。我考虑了这样一个事实,如果给定节点为空,然后我检查给定节点是头部还是尾部,最后我在需要的地方插入并更正节点指向的位置。我一定错过了一小部分,但我不确定是什么。有任何想法吗?谢谢!
// insert the new object after the node p
void DoublyLinkedList::insertAfter(DListNode &p, int newobj) {
if(isEmpty()) {
throw EmptyDLinkedListException("Empty Doubly Linked List");
}
DListNode *newNode = new DListNode();
newNode->obj = newobj;
newNode->prev = &p;
newNode->next = p.next;
if (p.next != NULL) {
p.next->prev = newNode;
}
p.next = newNode;
if(&trailer == &p){
trailer = *newNode;
}
}
// insert the new object before the node p
void DoublyLinkedList::insertBefore(DListNode &p, int newobj){
if(isEmpty()) {
throw EmptyDLinkedListException("Empty Doubly Linked List");
}
DListNode *newNode = new DListNode();
newNode->obj = newobj;
newNode->prev = p.prev;
newNode->next = &p;
if(&header == &p){
header = *newNode;
}
if (p.prev != NULL) {
p.prev->next = newNode;
}
}
我有一个列表,原来是:
100 90 80 70 60 50 40 30 20 10 10 20 30 40 50 60 70 80 90 100
然后我实现insertAfter函数在80后插入15:
cout << "On list2 insert 15 after 80. " << endl;
DListNode location = *dll2.getFirst()->next->next;
dll2.insertAfter(location, 15);
cout << "list2: " << dll2 << endl << endl;
根据调试器,一切都指向正确的位置,但上述函数调用的结果:
On list2 insert 15 after 80.
list2: 100 90 80 70 60 50 40 30 20 10 10 20 30 40 50 60 70 80 90 100
奇怪的是,当我实现 insertAfter 然后 insertBefore 像:
// add tests for insertAfter
cout << "On list2 insert 15 after 80. " << endl;
DListNode location = *dll2.getFirst()->next->next;
dll2.insertAfter(location, 15);
cout << "list2: " << dll2 << endl << endl;
//insertBefore
cout << "On list2 insert 9 before 80. " << endl;
dll2.insertBefore(location, 9);
cout << "list2: " << dll2 << endl << endl;
输出是这样的:
On list2 insert 15 after 80.
list2: 100 90 80 70 60 50 40 30 20 10 10 20 30 40 50 60 70 80 90 100
On list2 insert 9 before 80.
list2: 100 90 9 80 15 70 60 50 40 30 20 10 10 20 30 40 50 60 70 80 90 100
这表明之前插入了 9,之后插入了 15,但是当函数结束时,析构函数中出现分段错误,说明正在删除的节点未分配。
【问题讨论】:
-
"if(&p == NULL) " - 指针可以为空,但对象的地址永远不能为空,这里
&p是现有对象的地址。跨度> -
啊,好吧,我将更改引发的异常的措辞。谢谢你
-
Kate,一般来说,我们在代码中发现错误的方式并不是认真思考它。甚至不是通过将代码展示给其他可能更努力思考的人。我们在代码中发现错误的方法是使用调试器。我想最终可能会有人出现,他能够指出您的代码中的错误,但是如果您只使用调试器,您会为自己节省大量时间(并学习一项非常有价值的技能)。
-
不,Neil 的意思是您需要摆脱整个
if()语句以及抛出异常。它永远不会发生。 -
我已经使用了我的调试器和 insertAfter 函数,我用更新的代码表明一切都指向正确的方向。
标签: c++ linked-list insert