C++ 链表存在方法
C++ 链表存在方法,c++,linked-list,C++,Linked List,我的exist方法有问题。 我在列表中查找int,如果它在列表中,它可以工作,但如果不在列表中,它就不能工作,我会收到一个运行时错误,说它停止工作。 有一个包含两个类的类列表:Node和Iterator。 代码在这里 class List { private: class Node { public: Node(int d, Node *n = NULL, Node *p = NULL) : data(d), next(n), p
我的exist方法有问题。
我在列表中查找int,如果它在列表中,它可以工作,但如果不在列表中,它就不能工作,我会收到一个运行时错误,说它停止工作。
有一个包含两个类的类列表:Node和Iterator。 代码在这里
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;
}
类列表{
私人:
类节点{
公众:
节点(int d,节点*n=NULL,节点*p=NULL)
:数据(d),下一个(n),上一个(p){
int数据;
节点*下一步;
节点*prev;
};
公众:
类迭代器{
公众:
int next_元素(){
返回的int=当前->数据;
当前=当前->下一步;
返回到被返回的对象;
}
布尔有更多的元素(){
返回电流!=NULL;
}
私人:
节点*电流;
迭代器(节点*n){current=n;}
好友类列表;
};
公众:
List();
~List();
作废打印();
前推空(int x);
无效推回(int x);
无效清除();
bool存在(int x);
迭代器get_迭代器(){
返回迭代器(_头);
}
私人:
节点*头;
节点*\u最后;
};
列表::列表(){
_head=NULL;
_last=NULL;
}
作废列表::打印(){
对于(节点*p=\u head;p!=NULL;p=p->next)
cout data next=_head;
如果(_head!=NULL)
_head->prev=新节点;
_head=新的_节点;
如果(_last==NULL)
_last=新的_节点;
}
无效列表::推回(int x){
如果(_head==NULL)
向前推(x);
否则{
节点*新节点=新节点(x);
新建节点->上一个=\u最后一个;
_last->next=新建_节点;
_last=新的_节点;
}
}
列表::~List(){
清除();
}
无效列表::清除(){
节点*p=_头;
while(p!=NULL){
节点*q=p;
p=p->next;
删除q;
}
_head=NULL;
_last=NULL;
}
布尔列表::存在(int x){
迭代器it=this->get_Iterator();
而(it.current->data!=x&&it.has\u more\u elements())
it.current=it.current->next;
返回(it.current->data==x)?真:假;
}
这是我的主要任务
intmain(){
清单l;
l、 推回(86);
l、 向前推(43);
l、 向前推(12);
如果(l.存在(1)){
cout在访问指针指向的数据之前,您应该检查指针是否指向nullptr(请参见有更多元素()
)。更好的命名可能会避免一些混淆
while(it.current->data!=x && it.has_more_elements())
it.current=it.current->next;
return (it.current->data==x)?true:false;
如果x
不存在并且x
到达列表末尾,it.current->data
将导致运行时错误,因为x
可能为NULL
while(it.has_more_elements() && it.current->data!=x)
it.current = it.current->next;
return it.current!=NULL;
@AliSamie:定义“不工作”可能更清楚,例如,调试器告诉你什么?我只是在重写代码时犯了一个错误,它现在可以工作了
while(it.has_more_elements() && it.current->data!=x)
it.current = it.current->next;
return it.current!=NULL;