【问题标题】:Pop front and back in deque在双端队列中弹出前后
【发布时间】:2017-04-04 00:02:46
【问题描述】:

我正在尝试用一些函数实现一个双端队列:front(), back()、push_front()、push_back()、pop_front()、pop_back()。如果队列中有一个元素并尝试弹出它,我会在打印函数中收到“读取访问冲突”,但是我会检查双端队列中是否存在第一个元素。

#include<iostream>
#include<cstdlib>
using namespace std;

struct Nod {
    int info;
    Nod* next, *back;
};

void create_queue(Nod*& p, Nod*& u)
{
    Nod *c = new Nod;
    cout << "c->info: "; cin >> c->info;
    if (!p)
    {
        p = c;
        p->back = NULL;
        p->next = NULL;
        u = p;
    }
    else
    {
        u->next = c;
        c->back = u;
        u = c;
        u->next = NULL;
    }
}

void print_queue(Nod* p, Nod* u)
{
    if (p) {
        Nod *c = p;
        while (c) {
            cout << c->info << " ";
            c = c->next;
        }
    }
    else
        cout << "Deque is empty";
}

int front(Nod *p) {
    return p->info;
}

int back(Nod *u) {
    return u->info;
}

void push_front(Nod*& p, Nod*& u) {
    Nod *c = new Nod;
    cout << "Push front c->info "; cin >> c->info;
    c->next = p;
    p->back = c;
    c->back = NULL;
    p = c;
}

void push_back(Nod*& p, Nod*& u) {
    Nod *c = new Nod;
    cout << "Push back c->info "; cin >> c->info;
    c->back = u;
    u->next = c;
    u = c;
    u->next = NULL;
}

void pop_front(Nod*& p, Nod*& u) {
    if (p) {
        Nod *c = p;
        if (p->next != NULL) {
            p->next->back = NULL;
            p = p->next;
        }
        delete c;
    }
    else
    {
        cout << "Can't pop, deque is empty";
    }
}

void pop_back(Nod*& p, Nod*& u) {
    if (u){
        Nod *c = u;
        if (u->back != NULL) {
            u->back->next = NULL;
            u = u->back;
        }
        delete c;
    }
    else
    {
        cout << "Can't pop, deque is empty";
    }
}

int main()
{
    int n, i = 1;
    Nod *p, *u = new Nod;
    p = NULL;
    u = NULL;
    cout << "Nr nod: "; cin >> n;
    while (i <= n){
    create_queue(p, u);
    i++;
    }
    pop_front(p, u); //problems if there is only one element in deque
    print_queue(p, u);
    system("Pause");
}

【问题讨论】:

    标签: c++ deque


    【解决方案1】:

    当只有一个节点时,你 delete 它但它从未设置为 nullptr,因此你仍然访问那里的内存导致运行时错误。这里我写了修改后的pop_frontpop_back。特别是pop_back 现在将尾部前一个元素的next 指针设置为nullptr。如果双端队列中只有一个元素 (head == tail),我们将执行 pop_front,通过将其分配给下一个元素,将 head 设置为 nullptr

    void pop_front(Nod*& head, Nod* tail) {
        if (head) {
            Nod* nodePtr = head;
            head = head->next;
            delete nodePtr;
        }
    }
    
    void pop_back(Nod*& head, Nod*& tail) {
        if (head == tail) {
            return pop_front(head, tail);
        }
        Nod* prev = tail->back;
        prev->next = NULL;
        delete tail;
        tail = prev;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-08
      • 1970-01-01
      • 2020-12-25
      • 2018-07-16
      • 2012-03-19
      • 2018-07-02
      • 1970-01-01
      • 2015-03-18
      • 1970-01-01
      相关资源
      最近更新 更多