Как глубоко скопировать указатель объекта связанного списка - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь создать функцию, которая создаст новый связанный список с указателем на массив целых чисел.

Вот мой код, более подробная информация ниже:

#include "iostream"


using namespace std;

//Definition for singly-linked list.
struct ListNode {

    //members
    int val;
    ListNode *next;

    //constructor
    ListNode(int x) : val(x), next(NULL) {}

    //overload assignment operator
    void operator=(const ListNode &right_list ) { 
        val = right_list.val;
        next = right_list.next;
    }   

};

//error here:
//creating new linked list
ListNode*  createNewList(int* x, int length) {
    if (*x == NULL) return NULL;
    ListNode newList = ListNode(-1);
    ListNode* ptr = &newList;
    int count = 0;
    while (count < length) {
        ptr->val = *(x + counter);
        ListNode newElement = ListNode(-1);
        ptr->next = &newElement;
        ptr = ptr->next;
        counter++;
    }
    ListNode* returnPtr = &newList;
    return returnPtr;
}

int main() {


    //create List contents
    int x [5] = {2, 4, 5, 7, 9};
    int* y = x;

    //create list: doesn't work.
    ListNode* newList = createNewList(y, 5);

    cout << "debug test: neList first val is " << newList->val << endl;

    return 0;
}

С помощью GDB я обнаружил, что ошибка в строке:

ptr-> next = & newElement;

После цикла while в списке есть элементы {2, -1, -1, -1-1Я полагаю, что это потому, что я просто устанавливаю ptr-> рядом с адресом newElement вместо создания нового экземпляра ListNode, идентичного newElement, и устанавливаю ptr-> рядом с ним.

Но я подумалчтобы избежать этого и убедиться, что знак '=' создает глубокую копию, мне просто нужно перегрузить оператор присваивания в классе ListNode, что я и сделал.

Кроме того, значение returnPtr-> val прямо перед концом createNewList fn равно 2 (я проверял это с помощью gdb), но оператор cout печатает разные значения каждый раз, поэтому его некоторая форма не определенаповедение.Я не понимаю причину.

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

Спасибо за чтение :) любая информация приветствуется!

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Почему бы не

std::list<int> newlist {x, x+length};
0 голосов
/ 26 сентября 2018

Вы создаете элементы списка в стеке, поэтому они исчезают при выходе из функции.

вместо

ListNode newElement = ListNode(-1);

try

ListNode* newElement = new ListNode(-1);

Например

ListNode*  createNewList(int* x, int length) {
    if (x == nullptr) return x;
    ListNode* newList = new ListNode(-1);
    ListNode* ptr = newList;
    int count = 0;
    while (count < length) {
        ptr->val = *(x + counter);
        ListNode* newElement = new ListNode(-1);
        ptr->next = newElement;
        ptr = ptr->next;
        counter++;
    }
    return newList;
}

Здесь нет необходимости

int x [5] = {2, 4, 5, 7, 9};
int* y = x;

//create list: doesn't work.
ListNode* newList = createNewList(y, 5);

Вместо этого вы можете просто передать x напрямую

ListNode* newList = createNewList(x, sizeof(x)/sizeof(*x));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...