链接列表运算符重载没有打印出我想要的内容

Linklist operator overload doesn't print out what I want

本文关键字:我想要 打印 列表 运算符 重载 链接      更新时间:2023-10-16

我正在实现一个带有运算符重载的链接列表。 这 代码应该打印出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;
};

但更好的重新设计由一些程序员伙计和弗拉德从莫斯科