调用方法后存在分段故障()



我在操作双链表时遇到了麻烦。我很确定我有我的addNode(), getCount(), printList(),和getNode()工作良好,但在执行时,我得到我的存在()和deleteNode()方法的权利,我得到分段错误。exists()检查特定节点是否存在,deleteNode()传入一个id,如果id与节点id匹配,则删除该节点。我不知道哪个方法出错了。这是他们两个。这也是我的第一个帖子,所以如果它让人困惑和不彻底,我提前道歉。

bool LinkedList::deleteNode(int id){
bool didDelete = false;
bool hasResult = false;
Node *position;
position = head;
while(position!=NULL && !hasResult){
if(id == position->data.id){
hasResult = true;
} else {
std::cout << "position->next" << std::endl;
position = position->next;
}
}
// Deletes head node
if (position->prev == NULL) {
head = head->next;
head->prev = NULL;
delete (position);
didDelete = true;
}
// Deletes middle node
else if (position->next != NULL) {
position->prev->next = position->next;
position->next->prev = position->prev;
position->next = NULL;
position->prev = NULL;
delete(position);
didDelete = true;
}
// Deletes the tail node
//            else if(position->next == NULL){
else{
position->prev->next = NULL;
position->prev = NULL;
delete(position);
didDelete = true;
}
return didDelete;
} // End of deleteNode

bool LinkedList::exists(int id){
Node *position;
position = head;
bool gotNode = false;
while (position != NULL && !gotNode) {
if(id == position->data.id){
gotNode = true;
} else{
position = position->next;
}
}
return gotNode;
} // End of exists

您的exists()很好,尽管它可以简化一点:

bool LinkedList::exists(int id){
for(Node *position = head; position; position = position->next) {
if (id == position->data.id) {
return true;
}
}
return false;
}

你的deleteNode()坏了,虽然。如果指定的id没有被while循环找到,position将结束NULL,随后访问position->prev将调用未定义行为

这也是不必要的冗长,它可以大大简化:

bool LinkedList::deleteNode(int id){
for(Node *position = head; position; position = position->next){
if (id == position->data.id){
if (position->next) position->next->prev = position->prev;
if (position->prev) position->prev->next = position->next;
if (position == head) head = head->next;
/* uncomment this if you ever add such a field...
if (position == tail) tail = tail->prev;
*/
delete position;
return true;
}
}
return false;
}