2016-11-20 2 views
0

Я пытаюсь реализовать deque с некоторыми функциями: front(), back(), push_front(), push_back(), pop_front(), pop_back(). Если у меня есть один элемент в очереди, и я пытаюсь поместить его, я получаю «нарушение прав на чтение» в функции печати, однако я проверяю, существует ли первый элемент в deque.Pop front and back in deque

#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"); 
} 

ответ

1

Когда есть только один узел, вы delete его, но он никогда не установлен nullptr, таким образом, вы до сих пор доступ к памяти там вызывая ошибки во время выполнения. Здесь я написал модифицированные pop_front и pop_back. В частности, pop_back теперь устанавливает указатель next предыдущего элемента хвоста на nullptr. Если в deque есть только один элемент (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; 
}