2015-04-06 37 views
0

晚上好!如何爲鏈表創建'pop tail'函數C++

我目前正在嘗試創建一個自定義堆棧使用單個鏈接列表進行大學任務。

我創建了一個刪除mHead元素(列表的開頭)的工作流行,但我現在試圖修改該功能,而不是刪除mTail(列表中最近的節點)。我創建了節點mPrev,以取代mNext的功能。這個想法是將當前尾部設置爲NULL,並將新尾部設置爲mPrev,這將是倒數第二個節點所處的位置。 我相信我需要將mPrev設置爲mHead的值,只要我使用push(插入節點)。

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 << "\n\nThe 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 
+0

您應該使用atoi來將數字的文本表示轉換爲內部表示。 –

+0

使用'isdigit'函數來驗證一個字符是一個數字。 –

+0

在你的流行方法:看看你的主要其他。如果你到達那裏,意味着mtail = null,但是你正在訪問mTail-> mPrev(或者null-> mPrev),這就是拋出異常的原因。 –

回答

0

您不是將新創建的節點的mPrev分配給已經存在的尾節點。所以,創建的節點沒有`mPrev'。因此,在推功能中,添加以下內容:

newNode = new Node(data); 
    mTail->mNext = newNode; 
    newNode -> mPrev = mTail; 
    mTail = newNode;