链接列表运算符重载没有打印出我想要的内容
Linklist operator overload doesn't print out what I want
我正在实现一个带有运算符重载的链接列表。 这 代码应该打印出A B
但相反,它打印出了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;
}
在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"(另请参阅 user253751(,然后丢弃此结果"B"。最终结果是测试只包含"A"和test.printlist((;仅打印"A"。
从技术上讲,它可以通过定义来解决:
LinkedList operator+ (char const& data) {
listPush (data);
return *this;
};
但更好的重新设计由一些程序员伙计和弗拉德从莫斯科
相关文章:
- 如何设置一个范围来提取我想要获得的信息
- 链接列表运算符重载没有打印出我想要的内容
- 莱克斯没有返回我想要的东西
- 而不是那么多的 if 语句,我想要一个逻辑,我可以用一个语句或优化的方式来完成
- 我想要一个具有子函数的函数访问相同的命名函数,而不使用它取决于其子类的类
- 如何让m_refcount变量打印出我想要的值而不是垃圾
- 我想要一个改变数组快速排序的2个数字的函数
- 输出不是我想要C++的
- 使用运算符覆盖排序没有得到我想要的
- C ++,否则文本程序不会进入我想要的途径
- 如何声明一个未知大小的数组,然后输入直到我想要,然后获取数组的大小
- 我如何使用 juce 的文件过滤器描述我想要的文件过滤器?
- 如何设置此视觉工作室 (2015) 自定义生成步骤(工具?基本上,我想要一个修改头文件(c ++)的预处理器步骤
- 代码不会发送我想要的权衡
- 无法在openGL和GLUT中为我想要的确切对象设置动画
- 我如何强迫Visual Studio使用我想要的依赖性库名称
- 我的 OpenGL QQuickItem 没有我想要的大小
- 我可以/应该在 #ifndef 后输入任何我想要的东西
- C++ microshell,输入一个命令并使用fork(),dup(),pipe()将其通过管道传输到进程。只是我没有得到我想要的结果
- 程序不会打印我想要的所有内容