Программа приняла сигнал SIGSEGV, ошибка сегментации, в чем проблема, указатель не равен нулю

#c #c 11 #data-structures

#c #c 11 #структуры данных

Вопрос:

 #include lt;iostreamgt; #includelt;string.hgt;  using namespace std;  //Class Node Linked List  class Node { public:  string data;  Node *next; };  //Stack class  class stack { public:  Node * headref = new Node ();  //top = new Node();   //POP ELEMENT FROM STACK  string pop ()  {  string top;  if (headref == NULL)  {  cout lt;lt; "Stack is empty";  return "EMPTY";  }  else  {  top = headref-gt;data;  headref = headref-gt;next;  return top;  }   return top;  }  //PUSH ELEMENT IN STACK   string push (string element)  {  if (headref == NULL)  {  headref-gt;data = element;  headref-gt;next = NULL;  }  else  {  Node *newnode = new Node ();  newnode-gt;data = element;  newnode-gt;next = headref;  headref = newnode;  }  return "Hello";  }   //RETURNS TOP OF STACK  string top()  { //Segmentation Fault right here   string temp = headref-gt;data;  return temp;  }  //print stack  void printStack ()  {  while (headref != NULL)  {  cout lt;lt; headref-gt;data lt;lt; "n";  headref = headref-gt;next;  }  } };  //Converts infix to Postfix  class convert:public stack { private:  int precidence (string operatoor)  {  if (operatoor == "*" || operatoor == "/")  {  return 2;  }  if (operatoor == " " || operatoor == "-")  {  return 1;  }  if (operatoor == "^")  {  return 0;  }  } public:  string algorithmInfix (string infix)  {  string postfix;  for (int i = 0; i lt; infix.length (); i  )  {  string temp;  temp.push_back (infix[i]);  if (isalpha (infix[i]) || isdigit (infix[i]))  {  postfix = postfix   infix[i];  }  else  {  if (temp == "(")  {  cout lt;lt; "( goes in stack";  push (temp);  continue;  }  else if (temp == ")")  {  cout lt;lt; "Coming out of stack";  while (top () != "(")  {  postfix = postfix   pop ();  }  pop ();  }  if (top () == "" || top () == "("  || (precidence (temp) gt;= precidence (top ())))  {  push (temp);  }  else  {  while (precidence (top ()) gt;= precidence (temp))  {  if (top () == "(" || top () == ")")  {  push (temp);  break;  }  postfix = postfix   pop ();  }  push (temp);  }  }  }  string temp = top ();  while (true)  {  if (temp == "")  {  break;  }  postfix = postfix   pop ();  temp = top ();  }  /*while(top())  postfix = postfix   pop(); */  return postfix;  } };  //Main  int main () {  //stack obj;  convert obj;  string infix;  while (true)  {  cout lt;lt; "Insert your Infix statement. To Exit type exit!!:";  //cin.ignore();  getline (cin, infix);  if (infix == "exit" || infix == "EXIT" || infix == "Exit")  {  break;  }  //coutlt;lt;"here";  string postfix;  postfix = obj.algorithmInfix (infix);  //coutlt;lt;"here";  cout lt;lt; infix lt;lt; " " lt;lt; postfix lt;lt; endl;  }  /*obj.push('5');  obj.push('6');  string top = obj.pop();  coutlt;lt;"Poped this element-gt;"lt;lt;toplt;lt;endl;  obj.push('*'); */  obj.printStack ();  //coutlt;lt;"Hello"lt;lt;endl; }  

Комментарии:

1. Проверьте свою функцию push. Он проверяет наличие нулевого указателя, и если это правда, он все равно разыменовывает его. В более общем плане: это задание, которое требует, чтобы вы реализовали стек связанных списков, или мы можем дать обычное «просто используйте std::вектор»?

2. Связанный список со стеком

3. Разыменование ненулевого указателя также может привести к ошибке segfault, если указатель не указывает на допустимый объект.

4. Да, наконец, исправлено, ссылка headref не возвращалась обратно в начало связанного списка, а указывала на последний узел следующего узла, что делало ее нулевой.