为什么这个双端队列数据结构会导致读取访问冲突

时间:2018-04-13 13:50:44

标签: c++ access-violation deque

我有大学的家庭作业,我必须使用不是来自std / stl库的deque。我从我的大学指南中复制了他们卖给我的代码,但是当我测试它时,我得到了读访问违规错误。这是代码:

#include <iostream>
using namespace std;

struct deque
{
    int key;
    deque *next_element;

} *LEFT = NULL, *RIGHT = NULL;

void push_LEFT(int x);
void push_RIGHT(int x);
int pop_LEFT(int &x);
int pop_RIGHT(int &x);

int main()
{
    int temp;
    push_LEFT(1);
    push_LEFT(2);
    push_LEFT(3);
    push_LEFT(4);

    pop_LEFT(temp);
    cout << temp << endl;
    pop_LEFT(temp);
    cout << temp << endl;
    pop_LEFT(temp);
    cout << temp << endl;
    pop_LEFT(temp);
    cout << temp << endl;
    system("pause");
}

void push_LEFT(int x)
{
    deque *ex;
    ex = LEFT;
    LEFT = new deque;
    LEFT->key = x;
    if (RIGHT == NULL)
    {
        RIGHT = LEFT; 
    }

}

void push_RIGHT(int x)
{
    deque *ex;
    ex = RIGHT;
    RIGHT = new deque;
    RIGHT->key = x;

    if (LEFT == NULL)
    {
        LEFT = RIGHT;
    }

    else
    {
        ex->next_element = RIGHT;
    }

}

int pop_LEFT(int &x)
{
    deque *ex;
    if (LEFT)
    {
        x = LEFT->key;
        ex = LEFT;
        LEFT = LEFT->next_element;
        if (LEFT == NULL)
        {
            RIGHT = NULL;
        }
        delete ex;
        return 1;
    }
    else
    {
        return 0;
    }
}

int pop_RIGHT(int &x)
{
    deque *ex;
    if (RIGHT)
    {
        x = RIGHT->key;
        if (LEFT == RIGHT)
        {
            delete RIGHT;
            LEFT = RIGHT = NULL;
        }
        else
        {
            ex = LEFT;
            while (ex->next_element != RIGHT)
            {
                ex = ex->next_element;
            }
            x = RIGHT->key;
            ex->next_element = NULL;
            delete RIGHT;
            RIGHT = ex;
        }
        return 1;
    }
    else
    {
        return 0;
    }
}

我认为push函数有效,问题出在pop函数中,因为抛出了异常。提前谢谢!

1 个答案:

答案 0 :(得分:1)

我认为你的书中的例子是完全错误的,并且通过微小的修正它是不正确的,因此我为你写了一个新的代码。我认为你正在寻找一个使用push和pop方法的简单队列。我只在你的代码中写了一个方向队列或左一个,如果你愿意,你可以向右扩展一个。

#include <iostream>
using namespace std;

struct deque
{
    int key;
    deque *next_element=NULL;

} *LEFT = NULL;

void push_LEFT(int x);
void pop_LEFT(int &x);


int main()
{
    int temp;
    push_LEFT(1);
    push_LEFT(2);
    push_LEFT(3);
    push_LEFT(4);

    pop_LEFT(temp);
    cout << temp << endl;
    pop_LEFT(temp);
    cout << temp << endl;
    pop_LEFT(temp);
    cout << temp << endl;
    pop_LEFT(temp);
    cout << temp << endl;
    system("pause");
}

void push_LEFT(int x)
{

    if (LEFT== NULL)
    {
        LEFT = new deque;
        LEFT->key = x;
        LEFT->next_element = NULL;
    }
    else
    {
        deque* ext=LEFT;
        while (ext->next_element!=NULL)
        {
            ext = ext->next_element;
        }
        ext->next_element = new deque;
        ext->next_element->key = x;
    }
}

void pop_LEFT(int &x)
{
    if (LEFT)
    {
        x = LEFT->key;
        delete Left; 
        LEFT = LEFT->next_element;
    }
}