c ++链接列表堆栈弹出函数崩溃

时间:2017-12-06 01:17:49

标签: c++

我正在全世界最难理解这个链表列表。我得到了一个固定的" .h"我不允许编辑的文件,我将编写推送和弹出功能。然而,我的pop函数正在崩溃程序,我不确定为什么。我的pop功能如下:

 int IntStack::pop(){
    int result = -1;
    if(isEmpty()){
        result = head->data; //program crashes here
        Node *temp;
        temp = head->next;
        delete head;
        head = temp;
    }
    return result;
}

我的节点如下;

struct Node{
     int data;
     Node* next;
};

任何关于为什么会崩溃以及如何解决这个问题的见解将不胜感激。另外,我不允许在函数中有参数。谢谢

编辑:我对该函数进行了更改建议,这是我的其余代码。

 #include <iostream>
 #include <fstream>
 #include <string>
 #include "IntStack.h"

 using namespace std;

 bool ArePair(int first,char last){
     if(first == '(' && last == ')') return true;
     else if(first == '{' && last == '}') return true;
     else if(first == '[' && last==']') return true;
     return false;
 }

 int main(){
     string fileName;

     cout << "Hello, please enter a filename: ";
     cin >> fileName;

     ifstream inFile;

     inFile.open(fileName.c_str());

     while (!inFile){
         cerr << "ERROR: Cannot open " << fileName << ". Please re-enter.\n";
         cin >> fileName;
         inFile.open(fileName.c_str());
     }

     string current;
     IntStack iStack;
     int par; //parenthesis

     while(inFile){
        inFile >> current;

        for(int i=0;i<current.length();i++){
             if(current[i] == '('||current[i] == '{'||current[i] == '['){
                 par = current[i];
                 iStack.push(par);
                }
             else if(current[i] == ')'||current[i] == '}'||current[i] == ']'){
                 if(!iStack.isEmpty() || !ArePair(par,current[i])){
                     cout << "debug\n";
                 }
                 else{
                    iStack.pop();
                 }
             }
         }
     }



     inFile.close();

 }

我想我的pop函数的头部可能有一个无效的指针,但我不确定。或者也许是我的推送功能?

 void IntStack::push(int data){
     assert(!isFull());
         Node *temp = new Node;
         temp->data = data;
         temp->next = NULL;
         temp = head;
 }

1 个答案:

答案 0 :(得分:0)

你准备在那段代码中做什么?你可能只是完成了int result = head->data;,而不是使用temp的整个rigamarole,你最后会删除它。另外我估计你从来没有像我想的那样真正地移开头部。

我猜这就是你所问的:

int IntStack::pop(){ 
   int result = -1;             //Assume there is no element to pop
   if(!this->isEmpty()){        //if the stack is not empty,
        result = head->data;    //save the head's data in result
        Node *temp;             //make a temp node
        temp = head->next;      //point it to the node after the head
        delete head;            //remove the head
        head = temp;            //make the one after it the new head
    }
    return result;              //return the result
}

编辑:

您在代码中缺少头节点和尾节点。 当你有尾节点时,推送应该如下所示:

 void IntStack::push(char data){
     if(!this->isFull()){
         Node *temp = new Node;
         temp->data = data;
         tail->next = temp;
         temp->next = NULL;
     }
 }

ArePair最终会有一个松散的回报你应该这样规范:

 bool ArePair(int first, char last){
     if((first == '(' && last == ')') ||
        (first == '{' && last == '}') ||
        (first == '[' && last == ']'))
          return true;
     else return false;
 }

我认为您会发现这更有用,因为您自己了解其余代码,并且这里有一些基本结构。 https://www.codementor.io/codementorteam/a-comprehensive-guide-to-implementation-of-singly-linked-list-using-c_plus_plus-ondlm5azr