Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 堆栈在C++;使用双LL失败,出现异常“;EXC错误访问(代码=2,地址=0x7fff5df48ff8)和x201D;_C++ - Fatal编程技术网

C++ 堆栈在C++;使用双LL失败,出现异常“;EXC错误访问(代码=2,地址=0x7fff5df48ff8)和x201D;

C++ 堆栈在C++;使用双LL失败,出现异常“;EXC错误访问(代码=2,地址=0x7fff5df48ff8)和x201D;,c++,C++,目标: 我已经用双链表实现了一个堆栈。我使用的是双链表,因为输入大小是10亿,而使用任何其他数据结构都不会得到最佳解决方案 问题: 我在类MyStack()中声明了两个对象,称为root和tail。我想将这两个对象的值初始化为NULL。稍后,当我第一次调用push()方法时,它将覆盖对象root和tail的值。 在我的例子中,代码失败,出现一个异常,“EXC_BAD_ACCESS(code=2,address=0x7fff5df48ff8),因为root的值不是NULL。我不确定应该在哪里初始化

目标: 我已经用双链表实现了一个堆栈。我使用的是双链表,因为输入大小是10亿,而使用任何其他数据结构都不会得到最佳解决方案

问题: 我在类MyStack()中声明了两个对象,称为root和tail。我想将这两个对象的值初始化为NULL。稍后,当我第一次调用push()方法时,它将覆盖对象root和tail的值。 在我的例子中,代码失败,出现一个异常,“EXC_BAD_ACCESS(code=2,address=0x7fff5df48ff8),因为root的值不是NULL。我不确定应该在哪里初始化这些值,以便在调用push()之前不会覆盖root和tail

以下是.h文件:

#ifndef UNTITLED_MYSTACK_H
#define UNTITLED_MYSTACK_H


class MyStack {

    void* data;
    MyStack* next;
    MyStack* prev;
    MyStack* root;
    MyStack* tail;

public:

    MyStack();

    MyStack(void *data);

    MyStack * newNode();

    void *newNode(void* data);

    bool isEmpty(MyStack *root);

    void push(void *data);

    void *pop();

    int size();

    virtual ~MyStack();

};


#endif //UNTITLED_MYSTACK_H
下面是.cpp文件

#include <iostream>
#include <climits>
#include <cstdlib>
#include "MyStack.h"

using namespace std;

MyStack::MyStack() : root(NULL), tail (NULL) {} // <-- ERROR here -->

MyStack::MyStack(void *data) : data(data) {} // <-- ERROR here -->

MyStack * MyStack::newNode()
{
    MyStack* stackNode;
    stackNode = new MyStack();
    stackNode->data = NULL;
    stackNode->next = NULL;
    stackNode->prev = NULL;
    return stackNode;
}

void* MyStack::newNode(void* data)
{
    MyStack* stackNode;
    stackNode = new MyStack(data);
    stackNode->data = data;
    stackNode->next = NULL;
    stackNode->prev = NULL;
    return stackNode;
}

bool MyStack::isEmpty(MyStack *root) {
    return (root == NULL);
}

void MyStack::push(void *val) {
    if (isEmpty(root)) {

        root->data = newNode(val);
        tail->data = newNode(val);
        tail->next = newNode();
        tail = tail->next;
        root->next = tail;
        tail->prev = root;
        cout << " Element pushed to stack" << tail->data << endl;
    }
    else {
        tail->data = val;
        tail->next = newNode();
        tail->next->prev = tail;
        tail = tail->next;
        cout << " Element pushed to stack" << tail->data << endl;
    }
}


void *MyStack::pop() {
    if (isEmpty(tail)) {
        cout << "Stack is empty" << endl;
        return NULL;
    }
    MyStack* evictedN = new MyStack();
    evictedN = tail;
    tail = tail->prev;
    tail->next = newNode();
    tail = tail->next;
    return evictedN->data;
}


int MyStack::size() {
    if(isEmpty(root)) {
        cout << "Size is empty" << endl;
        return 0;
    }
    int count = 1;
    while (tail->prev != NULL) {
        count += 1;
        tail = tail->prev;
    }
    return count;
}


MyStack::~MyStack() {

}
//here is my main method

int main() {
    MyStack s;
    elem_t* elem;
    elem->value = 10;
    elem->other = 10 >> 1;
    s.push(elem);
    cout << elem->value << endl;
    cout << elem->other << endl;
    cout << s.pop() << endl;
    cout << s.size() << endl;
    return 0;
}
#包括
#包括
#包括
#包括“MyStack.h”
使用名称空间std;
MyStack::MyStack():根(NULL),尾(NULL){}//
MyStack::MyStack(void*data):数据(data){}//
MyStack*MyStack::newNode()
{
MyStack*stackNode;
stackNode=new MyStack();
stackNode->data=NULL;
stackNode->next=NULL;
stackNode->prev=NULL;
返回堆栈节点;
}
void*MyStack::newNode(void*data)
{
MyStack*stackNode;
stackNode=新的MyStack(数据);
stackNode->data=数据;
stackNode->next=NULL;
stackNode->prev=NULL;
返回堆栈节点;
}
bool MyStack::isEmpty(MyStack*root){
返回(root==NULL);
}
void MyStack::push(void*val){
if(isEmpty(root)){
根->数据=新节点(val);
尾部->数据=新节点(val);
tail->next=newNode();
tail=tail->next;
根->下一个=尾部;
尾部->上一个=根;
cout-next=newNode();
尾部->下一步->上一步=尾部;
tail=tail->next;
cout数据;
}
int MyStack::size(){
if(isEmpty(root)){
cout-prev;
}
返回计数;
}
MyStack::~MyStack(){
}
//这是我的主要方法
int main(){
MyStack;
元素(t)元素;;
元素->值=10;
元素->其他=10>>1;
s、 推(elem);

cout value主要问题是没有区分堆栈和堆栈包含的节点。MyStack::newNode()返回的是一个全新的堆栈,而不是新节点。根据以下代码:

void MyStack::push(void *val) {
  if (isEmpty(root)) {

    root->data = newNode(val);
    tail->data = newNode(val);
    tail->next = newNode();
    tail = tail->next;
    root->next = tail;
    tail->prev = root;
    cout << " Element pushed to stack" << tail->data << endl;
  }
  else {
    tail->data = val;
    tail->next = newNode();
    tail->next->prev = tail;
    tail = tail->next;
    cout << " Element pushed to stack" << tail->data << endl;
  }
}
void MyStack::push(void*val){
if(isEmpty(root)){
根->数据=新节点(val);
尾部->数据=新节点(val);
tail->next=newNode();
tail=tail->next;
根->下一个=尾部;
尾部->上一个=根;
cout-next=newNode();
尾部->下一步->上一步=尾部;
tail=tail->next;

cout这是MyStack_class.h文件:

#ifndef MYSTACK_CLASS_H
#define MYSTACK_CLASS_H

class elem_t {
    public:
        int value;
        int other;
        elem_t() {};
        elem_t(int value, int other) : value(value), other(other) {}
        ~elem_t() {};
};

class MyStack {
        private:
                void* data;
                MyStack* next;
                MyStack* prev;
        public:
                MyStack () {}
                MyStack(void* val) : data(val), next(nullptr), prev(nullptr) {}
                ~MyStack() {}
                MyStack* newNode();
                MyStack* newNode(void*);
                void push(void*);
                void* pop();
                int size();
};

#endif
~

以下是MyStack_class.cpp文件:

#include <iostream>
#include "MyStack_class.h"
#include <cstdlib>

using namespace std;

int count = 0;
MyStack* root = new MyStack();
MyStack* tail = new MyStack();;

MyStack* MyStack::newNode()
{
    MyStack* stackNode;
    stackNode = new MyStack();
    stackNode->data = NULL;
    stackNode->next = NULL;
    stackNode->prev = NULL;
    return stackNode;
}

MyStack* MyStack::newNode(void* data)
{
    MyStack* stackNode;
    stackNode = new MyStack(data);
    stackNode->data = data;
    stackNode->next = NULL;
    stackNode->prev = NULL;
    return stackNode;
}

void MyStack::push (void* val)
{
    if (count == 0) {
        root = newNode(val);
        tail = newNode(val);
        tail->next = newNode();
        tail = tail->next;
        root->next = tail;
        tail->prev = root;
        count++;
        cout << "Element: " << count <<  " pushed to Stack" << endl;
    }
    else {
        tail->data = val;
        tail->next = newNode();
        tail->next->prev = tail;
        tail = tail->next;
        count++;
        cout << " Element " << count << " pushed to stack" << endl;
    }
}

void*  MyStack::pop()
{
    if (count == 0) {
        cout << "Stack is empty" << endl;
        exit(1);
    }
    MyStack* evictedN = new MyStack();
    tail = tail->prev;
    evictedN = tail;
    tail->next = tail->next->prev = NULL;
    count--;
    return evictedN->data;
}

int MyStack::size() {
        int cnt = 0;
        while(root->next != NULL) {
                cnt++;
                root = root->next;
        }
        return cnt;
}

不要标记不相关的语言。@EugeneSh:从列表中删除了C。您的问题可能从main开始:
elem\t*elem;elem->value=10;
。指针没有指向任何地方,所以
10
指向何处?@BoPersson:哦,不..我忘了粘贴elem\t的结构声明。我正在编辑我的代码。谢谢您指向它告诉我。@Akshaya很高兴你能更新它,但这并不会让Bo说的话变得不真实。这个序列是对未定义行为的公然调用。
#include <iostream>
#include <cstdlib>
#include "MyStack_class.h"

#define NELEM 1000

using namespace std;

void
example() {
 MyStack* s = new MyStack;
        for (int i = 0; i < NELEM; i++) {
                elem_t* elem = new elem_t(i , i >> 1);
                if (elem == NULL) {
                        exit(1);
                }
                s->push(elem);
                cout << "the pushed element's value and other respectively : " <<  elem->value << " " << elem->other << endl;
        }
        cout << "Stack size : " << s->size() << endl;
        for (int i = (NELEM-1); i > 0; i--) {
                elem_t* elem = static_cast<struct elem_t*>(s->pop());
                if (elem->value != i) {
                        cout << "Error: i is " << i << "and elem-value is " << elem->value << endl;
                }
                cout << "The popped element's value and other respectively: " << elem->value << " " << elem->other << endl;
                delete elem;
        }
        delete s;
}

int
main()
{
    example();
        return 0;
}
MyStack_class: MyStack_class.o main.o
    g++ MyStack_class.o main.o -o MyStack_class

MyStack_class.o: MyStack_class.cpp main.cpp
    g++ -c -std=c++0x MyStack_class.cpp main.cpp

clean:
    rm MyStack_class.o main.o MyStack_class