Как сделать конструктор копирования для связанного списка? - PullRequest
0 голосов
/ 18 апреля 2020

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

У меня есть три файла, тест. cpp, который содержит main (), IntList. cpp и тест IntList.h.

. cpp и IntList.h были предоставлены моим профессором, поэтому можно с уверенностью предположить, что там нет ошибок. Я просто должен был написать IntList. cpp.

#include <iostream>
#include <cstdlib>
#include "IntList.h"


using namespace std;

IntList::IntList()
{
    head = NULL;
}

IntList::IntList(const IntList &)
{

    ???

}

Вот IntList.h. Дайте мне знать, если вам нужен тест. cpp или другие функции в IntList. cpp.

// Specification file for the IntList class
#ifndef INTLIST_H
#define INTLIST_H

class IntList
{
private:
   // Declare a structure for the list
   struct ListNode
   {
      int value;
      struct ListNode *next;
   };

   ListNode *head;   // List head pointer

public:
   // Constructor
   IntList();

   // Copy constructor
   IntList(const IntList &);

   // Destructor
   ~IntList();

   // List operations
   void appendNode(int val);
   void removeByVal(int val);
   void displayList();
   void insertByPos(int val, int pos);
   void removeByPos(int pos);
   int search(int val);
};

#endif /* INTLIST_H_ */

РЕДАКТИРОВАТЬ:

Я читаю все комментарии, но это не для меня.

Я пытался переписать код, но он все еще не имел смысла. Вот моя попытка, я чувствую, что просто не понимаю, как это должно выглядеть.

IntList::IntList(const IntList &list) // maybe I name it list so I can refer to list.head?
{
     ListNode *nodePtr;
     nodePtr = list.head;

     if (nodePtr == NULL) // If the head of list is empty then theres no list to copy
     { 
          return;
     }

     while (nodePtr->next != 0) // Trying to iterate through the link
     {
          nodePtr = nodePtr->next;
     }

     ListNode *newNode;   
     nodePtr->next = newNode; 

     // ??? Confused again. 

Вот моя функция для displayList ()

void IntList::displayList()
{

    ListNode *nodePtr;

    nodePtr = head;

    while (nodePtr != NULL)
    {
        cout << nodePtr->value << endl;
        nodePtr = nodePtr->next;
    }

}

А вот мой appendNode ().

void IntList::appendNode(int val)
{

    ListNode *newNode;
    ListNode *nodePtr;

    newNode = new ListNode;
    newNode->value = val;
    newNode->next = NULL;


    if (!head)
    {
        head = newNode;
    }
    else
    {

        nodePtr = head;

        while (nodePtr->next != 0)
        {
            nodePtr = nodePtr->next;
        }

        nodePtr->next = newNode;

    }

}

Это имело для меня большой смысл, и я довольно быстро их закончил. Я не понимаю, как реализовать эти идеи в конструкторе копирования. Можете ли вы помочь мне выяснить, что я не получаю?

1 Ответ

1 голос
/ 18 апреля 2020

Вот вам

IntList::IntList( const IntList &list ) : head( nullptr )
{
    ListNode **new_node = &this->head;

    for ( auto current = list.head; current != nullptr; current = current->next )
    {
        *new_node = new ListNode { current->value, nullptr };
        new_node = &( *new_node )->next; 
    }         
}

Если вам сложно понять, как обращаться с указателями на указатели, я могу предложить другое определение конструктора, которое не использует указатели на указатели.

IntList::IntList( const IntList &list ) : head( nullptr )
{
    if ( list.head != nullptr )
    {
        this->head = new ListNode { list.head->value, nullptr };

        for ( auto new_node = this->head, current = list.head->next;
              current != nullptr;
              new_node = new_node->next, current = current->next )
        {
            new_node->next = new ListNode { current->value, nullptr };
        }             
    }
}
...