Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 链接列表操作符重载不';不要把我想要的打印出来_C++_Operator Overloading_Operator Keyword - Fatal编程技术网

C++ 链接列表操作符重载不';不要把我想要的打印出来

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

我正在实现一个带有运算符重载的linkedlist。这个 代码本应打印出
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如果某个结果产生,则并不意味着它有意义。