2016-11-20 13 views
0

私は、いくつかの関数(デュアル)を実装しようとしています:front()、 back()、push_front()、push_back()、pop_front()、pop_backキューに1つの要素があり、それをポップしようとすると、印刷機能で「読み取りアクセス違反」が発生しますが、最初の要素が両端キューに存在するかどうかを確認します。デッキの前面と背面のポップ

#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_frontpop_backを書いています。特に、pop_backは、テールの前の要素のnextポインタをnullptrに設定します。両端キュー(head == tail)に要素が1つしかない場合は、をnullptrに設定して次の要素に割り当てることによって、pop_frontを実行します。

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; 
} 
関連する問題