2016-05-27 9 views
-2


Ich habe ein Problem in meiner bestehenden Methode.
Ich suche nach einem int in meiner Liste, wenn es in der Liste ist, funktioniert es, aber wenn nicht funktioniert es nicht und ich bekomme einen Laufzeitfehler, der sagt, es funktioniert nicht mehr.

Es gibt eine Klassenliste, die zwei Klassen enthält: Knoten und Iterator. Code ist hier.Link Liste Existenz Methode

class List { 
private: 
    class Node { 
    public: 
     Node(int d, Node *n = NULL, Node *p = NULL) 
      : data(d), next(n), prev(p) {} 

     int data; 
     Node *next; 
     Node *prev; 
    }; 

public: 
    class Iterator { 
    public: 
     int next_element() { 
      int to_be_returned = current->data; 
      current = current->next; 
      return to_be_returned; 
     } 
     bool has_more_elements() { 
      return current != NULL; 
     } 
    private: 
     Node *current; 
     Iterator(Node* n) { current = n; } 
     friend class List; 
    }; 

public: 
    List(); 
    ~List(); 
    void print(); 
    void push_front(int x); 
    void push_back(int x); 
    void clear(); 
    bool exists(int x); 
    Iterator get_iterator() { 
     return Iterator(_head); 
    } 
private: 
    Node* _head; 
    Node* _last; 
}; 

List::List() { 
    _head = NULL; 
    _last = NULL; 
} 

void List::print() { 
    for (Node* p = _head; p != NULL; p = p->next) 
     cout << p->data << ' '; 
} 

void List::push_front(int x) { 
    Node *new_node = new Node(x); 
    new_node->next = _head; 
    if (_head != NULL) 
     _head->prev = new_node; 
    _head = new_node; 
    if (_last == NULL) 
     _last = new_node; 
} 

void List::push_back(int x) { 
    if (_head == NULL) 
     push_front(x); 
    else { 
     Node *new_node = new Node(x); 
     new_node->prev = _last; 
     _last->next = new_node; 
     _last = new_node; 
    } 
} 

List::~List() { 
    clear(); 
} 

void List::clear() { 
    Node *p = _head; 
    while (p != NULL) { 
     Node *q = p; 
     p = p->next; 
     delete q; 
    } 
    _head = NULL; 
    _last = NULL; 
} 

bool List::exists(int x){ 
    Iterator it = this->get_iterator(); 
    while(it.current->data!=x && it.has_more_elements()) 
     it.current=it.current->next; 
    return (it.current->data==x)?true:false; 
} 

das ist mein Haupt()

int main() { 
    List l; 

    l.push_back(86); 
    l.push_front(43); 
    l.push_front(12); 
if(l.exists(1)){ 
     cout<<"t"; 
    } 
    else{ 
     cout<<"f"; 
    } 
} 

Antwort

0
while(it.current->data!=x && it.has_more_elements()) 
    it.current=it.current->next; 
return (it.current->data==x)?true:false; 

Wenn x nicht vorhanden ist und it erreicht das Ende der Liste, wird it.current->data Laufzeitfehler verursachen als itNULL sein kann.

while(it.has_more_elements() && it.current->data!=x) 
    it.current = it.current->next; 
return it.current!=NULL; 
+0

es nicht funktioniert @Gaurav –

+0

@AliSamie: Es könnte klarer zu definieren „nicht funktioniert“, zum Beispiel, was macht die Debugger Ihnen sagen? – stefaanv

+0

Ich habe gerade einen Fehler gemacht, den Code umzuschreiben, der jetzt funktioniert –

1

Sie sollten überprüfen, ob ein Zeiger vor Zugriff auf Daten durch den Zeiger (siehe has_more_elements()) wies auf nullptr. Eine bessere Benennung kann Verwirrung vermeiden.