C++ 链接列表操作符重载不';不要把我想要的打印出来
我正在实现一个带有运算符重载的linkedlist。这个 代码本应打印出C++ 链接列表操作符重载不';不要把我想要的打印出来,c++,operator-overloading,operator-keyword,C++,Operator Overloading,Operator Keyword,我正在实现一个带有运算符重载的linkedlist。这个 代码本应打印出ab,但它却打印出A。我有 实现此代码是为了能够使用+和- 接线员。但结果不是我想要的。有什么问题吗 #include <cstdio> #include <iostream> using namespace std; class listNode{ public: listNode* next; listNode* previous; char
ab
,但它却打印出A
。我有
实现此代码是为了能够使用+
和-
接线员。但结果不是我想要的。有什么问题吗
#include <cstdio>
#include <iostream>
using namespace std;
class listNode{
public:
listNode* next;
listNode* previous;
char data;
listNode(char data):data(data){};
};
class LinkedList{
public:
listNode* head=nullptr;
listNode* end=nullptr;
int listPush(char data){
listNode* tmp=new listNode(data);
if(end==nullptr && head==nullptr){
end=head=tmp;
end->next=nullptr;
end->previous=nullptr;
}
else{
end->next=tmp;
tmp->previous=end;
end=tmp;
end->next=nullptr;
}
return 0;
}
int listAddNode(listNode data){
if(end==nullptr && head==nullptr)
end=head=&data;
else{
end->next=&data;
(&data)->previous=end;
end=&data;
end->next=nullptr;
}
return 0;
}
listNode* listPop(){
listNode* tmp;
if(end==nullptr && head==nullptr)
return nullptr;
else if(head==end){
tmp=head;
head=end=nullptr;
return tmp;
}
else
{
tmp=end;
end=end->previous;
end->next=nullptr;
return tmp;
}
}
int printlist(){
listNode *tmp=head;
for(tmp;tmp!=nullptr;tmp=tmp->next)
cout<<tmp->data<<' ';
cout<<endl;
}
int operator+ (char const & data){
return listPush(data);
};
int operator- (char const & data){
listNode *tmp=end;
for(tmp;tmp!=nullptr;tmp=tmp->previous){
if(data==tmp->data && tmp==end){
if(end==head){
this->head=this->end=nullptr;
delete tmp;
break;
}
tmp->previous->next=nullptr;
end=tmp->previous;
delete tmp;
break;
}
else if(data==head->data && tmp==head){
tmp->next->previous=nullptr;
head=head->next;
delete tmp;
break;
}
else if(data==tmp->data){
tmp->previous->next=tmp->next;
tmp->next->previous=tmp->previous;
delete tmp;
break;
}
}
}
};
int main(int argc,char *argv[]){
LinkedList test;
test+'A'+'B';
test.printlist();
return 0;
}
#包括
#包括
使用名称空间std;
类listNode{
公众:
listNode*下一步;
listNode*上一个;
字符数据;
listNode(char数据):数据(data){};
};
类链接列表{
公众:
listNode*head=nullptr;
listNode*end=nullptr;
int listPush(字符数据){
listNode*tmp=新的listNode(数据);
if(end==nullptr&&head==nullptr){
末端=头部=tmp;
结束->下一步=nullptr;
end->previous=nullptr;
}
否则{
结束->下一步=tmp;
tmp->previous=结束;
end=tmp;
结束->下一步=nullptr;
}
返回0;
}
int listAddNode(listNode数据){
if(end==nullptr&&head==nullptr)
结束=头部=&数据;
否则{
结束->下一步=&数据;
(&数据)->previous=结束;
结束=&数据;
结束->下一步=nullptr;
}
返回0;
}
listNode*listPop(){
listNode*tmp;
if(end==nullptr&&head==nullptr)
返回空ptr;
否则,如果(头部==末端){
tmp=头部;
头部=末端=零PTR;
返回tmp;
}
其他的
{
tmp=结束;
结束=结束->上一步;
结束->下一步=nullptr;
返回tmp;
}
}
int打印列表(){
listNode*tmp=头部;
对于(tmp;tmp!=nullptr;tmp=tmp->next)
coutprevious->next=nullptr;
结束=tmp->上一个;
删除tmp;
打破
}
else if(数据==头部->数据和tmp==头部){
tmp->next->previous=nullptr;
头部=头部->下一步;
删除tmp;
打破
}
否则如果(数据==tmp->数据){
tmp->previous->next=tmp->next;
tmp->next->previous=tmp->previous;
删除tmp;
打破
}
}
}
};
int main(int argc,char*argv[]){
链接列表测试;
测试+'A'+'B';
test.printlist();
返回0;
}
在main
函数中,我添加了“A”和“B”进行测试,但它甚至没有显示B。如果我分别添加,结果将符合我的要求。我不知道怎么了。请帮助我。此功能
int listAddNode(listNode data){
if(end==nullptr && head==nullptr)
end=head=&data;
else{
end->next=&data;
(&data)->previous=end;
end=&data;
end->next=nullptr;
}
return 0;
}
调用未定义的行为,因为指针末端将指向函数的局部变量数据,该变量在退出函数后将不活动
作为操作员也要注意这一点
int operator+ (char const & data){
return listPush(data);
};
返回int,然后返回该语句
test+'A'+'B';
没有道理
例如,最好声明操作符+=
LinkedList & operator +=( char const & data );
原因是在最初的实施中
test+'A'+'B';
将“A”推送到测试,返回0,然后添加0+B,再次生成“B”(另请参见),然后丢弃此结果“B”。最终结果是测试只包含“A”和test.printlist();只打印“A”
从技术上讲,它可以通过定义来确定:
LinkedList operator+ (char const& data) {
listPush (data);
return *this;
};
但更好地重新设计以下参考和您的算术运算符
+
和-
是没有意义的<代码>测试+'A'+'B'等于(测试+'A'+'B'
),它不会将'B'
附加到列表中。请参阅,例如,查看运算符函数应该返回什么。当您使用调试器运行程序时,您看到了什么?这就是调试器的用途。如果您不知道如何使用调试器,这是一个很好的机会,可以学习如何使用调试器一次运行一行程序,监视所有变量及其值的变化,并分析程序的逻辑执行流。了解如何使用调试器是每个C++开发人员所需的技能,没有例外。在调试器的帮助下,您应该能够快速找到此程序和您编写的所有未来程序中的所有错误,而无需向任何人寻求帮助。这是有意义的。它将'A'
添加到列表test
,该列表返回0。然后它将'B'
添加到0,这将导致'B'
(数字66)。@user253751如果某个结果产生,则并不意味着它有意义。