2014-10-20 97 views
-2

我一直在研究我的析构函数,用于链接列表项目,其中偶数插入前面,奇数插入后面。取决于它是奇数还是偶数,删除在最后进行中起作用。我有一切工作,但我运行我的析构函数时不断收到错误。我已经完成了调试,它删除了所有的节点,但之后崩溃,我不知道为什么。这里是我的代码:链接列表析构函数崩溃C++程序

//Headerfile 
class Staque 
{ 
private: 
struct staqueNode 
{ 
    int value; 
    struct staqueNode *next; 
    struct staqueNode *prev; 
}; 

staqueNode *root; 


public: 
Staque(); 
~Staque(); 

void addNode(int addIn); 
void deleteNode(int oddIn, int evenIn); 
void display(); 
}; 

//header.cpp file 
#include"Staque.h" 
#include<iostream> 

using namespace std; 

Staque::Staque() 
{ 
root = NULL;  
} 

void Staque::addNode(int addIn) 
{ 
staqueNode *newNode; 
staqueNode *nodePtr; 
staqueNode *temp = NULL; 

newNode = new staqueNode; 
newNode->value = addIn; 
newNode->next = NULL; 
newNode->prev = NULL; 
if (!root) 
{ 
    root = newNode; 
} 
else 
{ 
    if (newNode->value % 2 == 0) 
    { 
     nodePtr = root; 
     while (nodePtr->next) 
     { 
      nodePtr = nodePtr->next; 
     } 
     nodePtr->next = newNode; 
     newNode->prev = nodePtr; 
    } 
    else if (newNode->value % 2 != 0) 
    { 
     nodePtr = root; 
     while (nodePtr->prev) 
     { 
      nodePtr = nodePtr->prev; 
     } 
     nodePtr->prev = newNode; 
     newNode->next = nodePtr; 
    } 
} 
} 
void Staque::deleteNode(int oddIn, int evenIn) 
{ 
staqueNode *nodePtr; 
staqueNode *temp = NULL; 
if (!root) 
    return; 
while (evenIn > 0) 
{ 
    nodePtr = root; 
    while (nodePtr != NULL && nodePtr->next != NULL) 
    { 
     temp = nodePtr; 
     nodePtr = nodePtr->next; 
    } 
    if (nodePtr == root && root->value % 2 == 0) 
    { 
     root = root->prev; 
     temp->next = NULL; 
     delete nodePtr; 
     evenIn = 0; 
    } 
    else 
    { 
     temp->next = NULL; 
     delete nodePtr; 
     evenIn -= 1; 
    } 
} 

while (oddIn > 0) 
{ 
    nodePtr = root; 
    while (nodePtr != NULL && nodePtr->prev != NULL) 
    { 
     temp = nodePtr; 
     nodePtr = nodePtr->prev; 
    } 
    if (nodePtr == root && root->value % 2 != 0) 
    { 
     root = root->next; 
     temp->prev = NULL; 
     delete nodePtr; 
     oddIn = 0; 
    } 
    else 
    { 
     temp->prev = NULL; 
     delete nodePtr; 
     oddIn -= 1; 
    } 
} 

} 

void Staque::display() 
{ 
staqueNode *nodePtr; 

nodePtr = root; 
while (nodePtr->next) 
{ 
    nodePtr = nodePtr->next; 
} 
cout << "\nThe staque: "; 
while (nodePtr->prev) 
{ 
    cout << nodePtr->value << " "; 
    nodePtr = nodePtr->prev; 
} 
cout << nodePtr->value << endl; 

} 

Staque::~Staque() 
{ 
staqueNode *nodePtr; 
staqueNode *temp; 
nodePtr = root; 

while (nodePtr->next) 
{ 
    temp = nodePtr; 
    nodePtr = nodePtr->next; 
} 
//nodePtr = root; 
while (nodePtr->prev) 
{ 
    temp = nodePtr; 
    nodePtr = nodePtr->prev; 
    delete temp; 
} 
//delete root; 

} 


//source/main.cpp 
#include"Staque.h" 
#include<iostream> 


using namespace std; 

int main() 
{ 
Staque myList; 
int choice; 
int input; 
int numOdd; 
int numEven; 

do 
{ 
    cout << "Would you like to: \nAdd a node: 1\nDelete a node: 2\nDisplay the list: 3\nQuit: 0\n"; 
    cin >> choice; 
    while (choice < 0 || choice > 3) 
    { 
     cout << "Invalid Input: Would you like to: \nAdd a node: 1\nDelete a node: 2\nDisplay the list: 3\nQuit: 0\n"; 
     cin >> choice; 
    } 
    switch (choice) 
    { 
    case 1: 
     cout << "Enter the value you would like to add to the list: "; 
     cin >> input; 
     while (isalpha(input)) 
     { 
      cout << "Invalid input: Enter the value you would like to add to the list: "; 
      cin >> input; 
     } 
     myList.addNode(input); 
     myList.display(); 
     break; 

    case 2: 
     cout << "Enter the number of even numbers you would like to delete: "; 
     cin >> numEven; 
     while (isalpha(input) || numEven < 0) 
     { 
      cout << "Invalid input: Enter the number of even numbers you would like to delete: "; 
      cin >> numEven; 
     } 

     cout << "Enter the number of odd numbers you would like to delete: "; 
     cin >> numOdd; 
     while (isalpha(input) || numEven < 0) 
     { 
      cout << "Invalid input: Enter the number of odd numbers you would like to delete: "; 
      cin >> numOdd; 
     } 
     myList.deleteNode(numOdd, numEven); 
     myList.display(); 
     break; 

    case 3: 
     myList.display(); 
     break; 

    default: 
     break; 

    } 
} while (choice != 0); 

myList.~Staque(); 

return 0; 

} 
+1

什么是错误? – Celeo 2014-10-20 21:16:24

+0

'我有一切工作,但当我运行我的析构函数时,我总是收到一个错误'这可能意味着整件事*不*工作。另外,请修正您的格式。 – PaulMcKenzie 2014-10-20 21:17:54

+1

我怀疑你没有遵守[Rule of Three](http://stackoverflow.com/q/4172722/10077)。 – 2014-10-20 21:18:29

回答

1

一个明显的错误是你明确地调用你的析构函数。

myList.~Staque(); 

您不应该这么做 - 当物体超出范围时,物体将自然“死亡”。通过显式调用析构函数,对象将调用析构函数,然后当对象超出范围时,析构函数将被第二次调用。这是第二次调用会导致所有的破坏。

您应该明确调用析构函数的时间是如果您使用placement-new,并且您在此没有这样做。因此,只需删除上面的那一行,看看错误是否消失。如果没有,那么你还有其他问题,但至少你会从代码中删除这个明显的问题。

+0

谢谢,这解决了我得到的错误。我以为我必须明确地调用它,否则会留下内存使用。 – JBoyden 2014-10-20 21:52:27

0

看你的析构函数特别...

时NODEPTR为空,会发生什么?例如你没有创建一个节点。

或者你到达最后一个总是将下一个ptr设置为NULL的节点,然后在空指针上解引用nodePtr-> next - 是的,你猜它是一个崩溃。

你的while(nodePtr-> next)什么是临时任务在做什么?看起来没有用。

while(nodePtr-> prev)???

不检查nodePtr为空吗?

多数民众赞成开始。

你确定它的其余部分工作?