如何为链表C++创建"弹出尾巴"函数

How to create a 'pop tail' function for a Linked List C++

本文关键字:函数 创建 链表 C++      更新时间:2023-10-16

晚上好!

我目前正在尝试创建一个自定义堆栈,使用一个单独的链接列表为大学作业。

我创建了一个工作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;