如何为链表C++创建"弹出尾巴"函数
How to create a 'pop tail' function for a Linked List C++
晚上好!
我目前正在尝试创建一个自定义堆栈,使用一个单独的链接列表为大学作业。
我创建了一个工作pop,删除了mHead元素(列表的开头),尽管我现在正试图修改该函数,以删除mTail(列表上最近的节点)。我创建了节点mPreviv来替换mNext的功能。其想法是将当前尾部设置为NULL,并将新尾部设置为mPrevi,这将是倒数第二个节点。我相信每当我使用push(插入节点)时,我都需要将mPrevi设置为mHead的值。
Pop和Push是有问题的主要功能,大多数其他功能在很大程度上可以被安全地忽略。
每当我按原样运行代码时,我都会收到访问违规。不用说,我对内容的现状感到不稳定,所以任何澄清或提示都将不胜感激!
#include "stack.h"
Stack::Stack(){ //Constructor
mHead = NULL;
mTail = NULL;
mPrev = NULL;
}
Stack::~Stack(){ //Deconstructor
}
/*
Function: int Stack::charConverter(char convertee)
* Purpose : Convert char to numerical equivilent
* Pre: A char to convert
* Post : An integer is returned
****************************************************************/
int Stack::charConverter(char convertee){
switch (convertee){
case '1': return 1;
case '2': return 2;
case '3': return 3;
case '4': return 4;
case '5': return 5;
case '6': return 6;
case '7': return 7;
case '8': return 8;
default: return 9;
}
}
/*
Function: bool Stack::checker(char searchKey)
* Purpose : To determine whether a given character is a usable character (num or operator_
* Pre: A character
* Post : A bool is returned indicating whether or not the given is a usable character
****************************************************************/
bool Stack::checker(char searchKey){
if ((searchKey == '1') || (searchKey == '2') || (searchKey == '3') || (searchKey == '4') || (searchKey == '5')
|| (searchKey == '6') || (searchKey == '7') || (searchKey == '8') || (searchKey == '9') || (searchKey == '+')
|| (searchKey == '-') || (searchKey == '*') || (searchKey == '/') || (searchKey == '^') || (searchKey == '=')){
return true;
}
else {
return false;
}
}
/*
Function: void Stack::display()
* Purpose : To display the entirety of the list
* Pre: None (Though a populated list wouldn't hurt)
* Post : The list is displayed
****************************************************************/
void Stack::display(){
cout << "nnThe List: n";
Node *tmp = mHead;
while (tmp != NULL){
cout << tmp->mData;
if (tmp->mNext != NULL)
cout << "";
tmp = tmp->mNext;
}
delete(tmp);
}
/*
Function: bool Stack::push(int data)
* Purpose : To push a given character/number into the list
* Pre: A character/number to add and a list to add to
* Post : A new character/number is added
****************************************************************/
bool Stack::push(int data){
Node *newNode;
if (mHead == NULL){
mHead = new Node(data); //new case
if (mHead == NULL)
return false;
mTail = mHead; //add to end of case
}
else{
if (isExist(data))
return false;
newNode = new Node(data);
mTail->mNext = newNode;
mTail = newNode;
return true;
} //for else
return true;
} //either way, it is entered successfully
/*
Function: bool Stack::isExist(int searchKey)
* Purpose : To determine whether a given character exists within the list
* Pre: A populated list and character to search for
* Post : A bool is returned indicating whether or not the given character exists
****************************************************************/
bool Stack::isExist(int searchKey){
Node *tmp = mHead;
while (tmp != NULL){
if (tmp->mData == searchKey)
return true;
tmp = tmp->mNext;
}
return false;
}
/*
Function: bool Stack::isNumber(char searchKey)
* Purpose : To determine whether a given character is a number
* Pre: A character
* Post : A bool is returned indicating whether or not the given is a number
****************************************************************/
bool Stack::isNumber(char searchKey){
if ((searchKey == '1') || (searchKey == '2') || (searchKey == '3') || (searchKey == '4') || (searchKey == '5')
|| (searchKey == '6') || (searchKey == '7') || (searchKey == '8') || (searchKey == '9')){
return true;
}
else {
return false;
}
}
/*
Function: bool Stack::operate(int num1, int num2, char function)
* Purpose : Perform mathematical functions
* Pre: 2 numbers to operate on and an operator
* Post : An integer is returned
****************************************************************/
int Stack::operate(int num1, int num2, char function){
switch (function){
case '*': return (num1*num2);
case '-': return (num1-num2);
case '+': return (num1+num2);
case '^': return (num1^num2);
case '/': return (num1/num2);
}
}
/*
Function: char Stack::pop()
* Purpose : To pop the top of the list
* Pre: A list with at least 1 character
* Post : The list has 1 less character
****************************************************************/
char Stack::pop(){
Node *tmp;
char data; //when nothing to pop, it will return this value
if (mTail != NULL){
tmp = mTail; //tmp pointing at node to be deleted
if (mHead == mTail){
mHead = NULL;
mTail = NULL;
}
else{
mTail = mTail->mPrev;
}
tmp->mPrev = NULL;
data = tmp->mData;
delete tmp;
}
return data;
}
/*
Function: char Stack::returnNumber(char searchKey)
* Purpose : To recieve a char input and output the corresponding int
* Pre: A char that has been checked using isNumber()
* Post : An int is returned
****************************************************************/
int Stack::returnNumber(char searchKey){
//Before using this function, be sure to make sure the input is a number using isNumber()
switch (searchKey){
case '1': return 1;
break;
case '2': return 2;
break;
case '3': return 3;
break;
case '4': return 4;
break;
case '5': return 5;
break;
case '6': return 6;
break;
case '7': return 7;
break;
case '8': return 8;
break;
default: return 9;
}
}
/*
Function: int Stack::top()
* Purpose : To return the value of the top member of the stack
* Pre: A stack with node(s)
* Post : An int is returned
****************************************************************/
int Stack::top(){ //Essentiall a get function
Node *tmp = mTail;
return tmp->mData;
}
void Stack::userInput(){
bool validation = false;
string userInput, junk;
int lengthCheck = 1;
while (validation == false){
cout << "nEnter your equation in postfix: ";
getline(cin, userInput);
for (char & input : userInput)
{
if (((lengthCheck == 1) || (lengthCheck == 2)) && (isNumber(input) == 0)){ //Make sure first character is a number is a number
cout << ERROR_INVALID_FIRST_LAST << endl;
break;
} else if (checker(input) == 0){
cout << ERROR_INVALID_INPUT; //Make sure everything is a valid character
break;
} else {
push(input);
}
lengthCheck++;
}
}
}
#ifndef _STACK_H
#define _STACK_H
#include <string>
#include <iostream>
#include <iomanip>
#include "header.h"
using namespace std;
const string ERROR_INVALID_INPUT = "nError: The input you have entered is invalid, remember to use only operators and single digits. ";
const string ERROR_INVALID_FIRST_LAST = "nError: First and last character must always be a number, and last a '='. ";
class Stack{
private:
struct Node{
int mData;
Node *mNext, *mPrev; //Node gives int and next pointer
Node(){ //Default constructor
mNext = NULL;
mPrev = NULL;
}
Node(int value){
mData = value;
mNext = NULL;
}
};
Node *mHead, *mTail, *mPrev; //Start and end of list
public:
Stack();
~Stack();
int charConverter(char convertee);
bool checker(char searchKey);
void display();
bool push(int data);
bool isExist(int searchKey);
bool isNumber(char searchKey);
int operate(int num1, int num2, char function);
char pop();
int returnNumber(char searchKey);
int top();
void userInput();
};
#endif
您没有将新创建的节点的mPrev
分配给已经存在的尾部节点。因此,创建的节点没有"mPrevi"。因此,在推送功能中,添加以下内容:
newNode = new Node(data);
mTail->mNext = newNode;
newNode -> mPrev = mTail;
mTail = newNode;
相关文章:
- 通过构造函数创建的所有对象都具有相同的向量
- 通过构造函数创建一些值并尝试添加到文档中使用 rapidjson 不起作用
- 为 NewObjectA() 函数创建 jvalues 的参数数组时出错 - JNI Invocation API
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- C++ :: 如何捕获由 void 函数创建的矩阵
- 通过零参数构造函数创建的 glm::mat4 应该包含哪些值?
- 用于基于成员字段或函数创建比较器的快捷方式
- std::使用类成员函数创建线程 - 最佳实践
- 为C++重载函数创建SWIG类型映射
- 使用成员函数创建std::函数不会编译
- 如何为返回特定类型的函数创建 SWIG 类型图
- 为具有多个参数的函数创建 SWIG 类型图的更简单方法?
- 通过另一个宏创建的函数创建所有列表的宏
- std::map<int, A> 运算符 [] 需要使用空构造函数创建 A
- 无法使用 CreateWindowEx 函数创建窗口
- c++ 从成员函数创建新线程并移动对象和整个对象
- 无法使用 c++ 中的类成员函数创建/写入文件
- 使用makeword函数创建错误e0109-表观呼叫的括号前表达式必须具有(指针到 - )函数类型
- 为 OpenMP 函数创建别名 ||部分禁用 openMP
- 稍后使用<Class>调用类构造函数创建 std::vector