Перегрузка оператора Linklist не выводит то, что я хочу - PullRequest
0 голосов
/ 11 февраля 2020

Я реализую связанный список с перегрузкой оператора. Код должен был распечатать 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. Если я добавлю ее соответственно, чем результат будет так, как я хочу. Я не знаю что не так. Пожалуйста, помогите мне.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

Причина в том, что в исходной реализации

test+'A'+'B';

нажимает «A» для проверки, возвращает 0, а затем добавляет 0 + «B», что снова приводит к «B» (см. Также user253751 ) и затем отбрасывает этот результат «B». Окончательный результат - тест содержит только «A» и test.printlist (); печатает только 'A'.

Технически это можно исправить по определению:

LinkedList operator+ (char const& data) {
    listPush (data);
    return *this;
  };

Но лучше изменить дизайн по ссылке Некоторые программисты чувак и Влад из Москва

0 голосов
/ 11 февраля 2020

Эта функция

    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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...