我正在全世界最难理解这个链表列表。我得到了一个固定的" .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;
}
答案 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