Как вернуть связанный список из функции? Почему, когда я возвращаю его, он дает мне адрес? - PullRequest
0 голосов
/ 04 апреля 2020

Прежде чем вы прочитаете это, я новичок в c ++ , приветствуется любая обратная связь, просто не стесняйтесь sh пожалуйста: (

Так что в основном я добавляю элементы в список с двумя связями, и в функции ниже моя цель состоит в том, чтобы взять его элементы, добавить их в мой список с односвязными связями и вернуть его, однако я просто возвращаю указатель на список.

Я просто застрял в этом небольшая проблема,

Когда я возвращаю его, он дает мне адрес, я делаю что-то не так в функции, я просто могу это указать, остальная часть кода работает со мной нормально. Надеюсь Я поставил свой вопрос правильно, спросите меня по-другому. Любая помощь очень ценится.

    template <class Type>
    SinglyLinkedList<Type> *DoublyLinkedList<Type>:: Function()  {

    SinglyLinkedList<Type>* newList = new SinglyLinkedList<Type>();

    nodeDLL<Type>* p = head2;

    //I added the values from the doubly linked list into the singly linked list
    while (p !=NULL) {

    newList->addToHead(p->value2);

    p=p->next2;

    }

    // I used the print function to make sure the above works and it works the way I want,
    newList->print();

    // but when I return it here it gives me an address?
    return newList;

Для справки здесь остальная часть кода:

класс для Узел односвязного списка


    template <class Type>
    class nodeSLL {

    public:

    nodeSLL* next;
    Type value;


    nodeSLL(Type v, nodeSLL* n) {

    value = v;
    next = n;

    }

    ~nodeSLL() {

    cout << "node destroyed" << endl;
    }


    };

Класс односвязного списка


    template <class Type>
    class SinglyLinkedList {

    public:

    nodeSLL<Type>* head;
    nodeSLL<Type>* tail;


    SingyLinkedList();
    SinglyLinkedList(SinglyLinkedList<Type> &obj);
    void addToHead(Type v);
    void addToTail(Type v);
    void print();

    ~SinglyLinkedList();
    };


template <class Type>
 SinglyLinkedList<Type>::SinglyLinkedList(const SinglyLinkedList &obj) // Copy Constructor
{
   head = obj.head;
   tail = obj.tail;

}



template <class Type>
SinglyLinkedList<Type>:: SinglyLinkedList() {

head = tail = NULL;

}
template <class Type>
SinglyLinkedList<Type>:: ~SinglyLinkedList() {

nodeSLL<Type> *p = head;
        while (p != NULL) {
            head = head->next;
            delete p;
            p = head;
        }

}

функция печати


    template <class Type>
    void SinglyLinkedList<Type>:: print() {
    nodeSLL<Type> * t = head;
    while (t != NULL) {
                cout << t->value << " => ";
                t = t->next;

            }
            cout << "  NULL"<< endl;


    }

добавить в голову function


    template <class Type>
    void SinglyLinkedList<Type>:: addToHead(Type v) {

    nodeLL<Type> *newNode = new nodeSLL<Type>(v, head);


    if (head == NULL) {

    head = tail = newNode;

    } else {

    head = newNode;

    }


Узел двусвязного списка



    template <class Type>
    class nodeDLL {


    public:

    nodeDLL* next2;
    nodeDLL* prev2;
    Type value2;

    nodeDLL<Type>(nodeDLL<Type>* prv, Type v, nodeDLL<Type>* n) {

    value2 = v;
    next2 = n;
    prev2 = prv;

    }

    ~nodeDLL() {

    prev2 = next2 = NULL;
    cout << "node destroyed" << endl;
    }


    };

Дважды li nked list class


    template <class Type>
    class DoublyLinkedList {

    public:

    nodeDLL<Type>*head2;
    nodeDLL<Type>*tail2;


    DounlyLinkedList();
    void addToHead2(Type v);
    void Clear();
    ~DoublyLinkedList();
    };

Добавить в голову двусвязный список


    template <class Type>
    void DoublyLinkedList<T>:: addToHead2(Type v) {


    nodeDLL<T>* newNode = new nodeDLL<Type>(NULL, v, head2);
        if (head2 == NULL) { 
            head2 = tail2 = newNode;
        }
        else  { 
            head2->prev2 = newNode;
            head2 = newNode;
        }

    }


Основная функция


    int main()
    {

    SinglyLinkedList<int>* list1;
    DoublyLinkedList<int> lists;

    lists.addToHead2(55);
    lists.addToHead2(87);
    lists.addToHead2(2);


    //list1 = lists.Function();
    cout <<lists.Function();



        return 0;
    }


1 Ответ

0 голосов
/ 04 апреля 2020

Он дает адрес, потому что это то, что вы написали в коде. Не используйте указатели, если вы не хотите адресов. Вместо этого сделайте это следующим образом

template <class Type>
SinglyLinkedList<Type> DoublyLinkedList<Type>::Function() {
    SinglyLinkedList<Type> newList;
    nodeDLL<Type>* p = head2;
    //I added the values from the doubly linked list into the singly linked list
    while (p !=NULL) {
        newList.addToHead(p->value2);
        p=p->next2;
    }
    // I used the print function to make sure the above works and it works the way I want,
    newList.print();
    return newList;
}

Но для того, чтобы это работало, вашему классу односвязных списков понадобится допустимый конструктор копирования (потому что список может быть скопирован, когда вы вернетесь из функции), и я не вижу доказательств того, что у вас есть это.

Вам нужно прочитать о правиле трех , прежде чем вы go продолжите.

...