단일 연결 목록을 위한 C++ 복사 생성자

Dr. Muhammad Abdullah 2024년2월15일
  1. C++ 연결 목록 데이터 구조
  2. 단일 연결 목록의 예제 코드
  3. 단일 연결 목록의 C++ 복사 생성자
단일 연결 목록을 위한 C++ 복사 생성자

이 기사에서는 먼저 Linked List 데이터 구조의 개념과 이를 사용하기 위한 적절한 시나리오에 대해 설명합니다. 그런 다음 C++를 사용하여 단일 연결 목록의 단일 목록 및 복사 생성자를 위한 간단한 구현에 대해 설명합니다.

C++ 연결 목록 데이터 구조

Linked List 데이터 구조의 주요 장점은 비연속 메모리 위치에 데이터를 저장할 수 있다는 것입니다. 이것은 각 노드가 데이터 항목(키 및 관련 위성 데이터)과 다음 노드에 대한 참조를 저장하는 노드로 구성된 선형 데이터 구조입니다.

헤드 포인터는 이 데이터 구조의 첫 번째 노드를 가리킵니다. 따라서 헤드 노드라고도 합니다. 단일 연결 목록의 일부 고전적인 구현에는 목록의 마지막 노드를 가리키는 테일 포인터도 있습니다.

예를 들어, 다음 그림은 꼬리 포인터가 없는 연결 목록 개념의 예시 묘사를 보여줍니다.

연결된 목록 개념

Linked List에는 세 가지 유형이 있습니다.

  1. 단일 연결 리스트 또는 단순 연결 리스트

    Singly Linked List라고도 하는 간단한 Linked List이며 앞으로만 이동할 수 있습니다. 각 노드는 데이터 항목과 다음 노드의 참조를 저장합니다.

  2. 이중 연결 리스트

    앞뒤로 이동할 수 있는 Linked List입니다. 이중 연결 리스트의 각 노드는 데이터 항목, 다음 노드의 참조, 이전 노드의 참조로 구성됩니다.

    웹 브라우저의 다음 페이지 및 이전 탐색을 포함하여 do/redo 상태 시나리오에 적합합니다.

  3. 순환 연결 목록

    목록의 마지막 노드에 있는 다음 포인터가 항상 첫 번째 노드를 가리킨다는 점을 제외하면 Singly Linked List와 거의 동일합니다. 이렇게 하면 원이 생성됩니다. 따라서 순환 연결 목록이라고 합니다.

    일반적으로 순환 대기열 관리 시스템에서 편리합니다.

단일 연결 목록의 예제 코드

Singly Linked List의 다음 C++ 구현을 살펴보겠습니다.

#include <iostream>
using namespace std;

class Node {
 public:
  int data;
  Node* next;
};
class LinkedList {
 public:
  Node* head;

  LinkedList() { head = nullptr; }
  void addNewItem(int data) {
    Node* temp = new Node();
    temp->data = data;
    temp->next = head;
    head = temp;
  }
  void display() {
    Node* temp = head;
    while (temp != nullptr) {
      cout << temp->data << ",";
      temp = temp->next;
    }
    cout << endl;
  }
};
int main() {
  LinkedList list;
  list.addNewItem(5);
  list.addNewItem(10);
  list.addNewItem(15);
  list.display();
  return 0;
}

위의 코드는 다음 클래스로 구성됩니다.

  1. 두 개의 멤버 변수가 있는 Node 클래스: dataNode 클래스 포인터 next. data 변수는 요소의 값을 저장하는 데 사용되고 next 변수는 다음 요소의 참조를 저장하는 데 사용됩니다.
  2. 클래스 LinkedList에는 연결 목록의 첫 번째 요소, 생성자 LinkedList() 및 두 개의 멤버 함수 addNewItemdisplay()를 저장하는 데 사용되는 Node유형의 멤버 변수head가 있습니다. . LinkedList() 생성자는 null 값으로 헤드를 초기화합니다.

addNewItem 메서드는 Linked List 앞에 새 요소를 추가하는 데 사용됩니다. 이 함수의 이름을 AddToFront 또는 push로 지정할 수도 있습니다.

display() 메서드는 연결된 목록 요소를 표시합니다.

단일 연결 목록의 C++ 복사 생성자

다음은 Singly Linked List의 Copy 생성자 코드입니다.

LinkedList(const LinkedList& obj) {
  if (obj.head != nullptr) {
    this->head = new Node;
    this->head->data = obj.head->data;
    Node* temp = obj.head->next;
    Node* temp2 = this->head;
    while (temp != nullptr) {
      Node* newNode = new Node;    ////
      newNode->data = temp->data;  ////    creating new node
      newNode->next = temp->next;  ////
      temp2->next = newNode;
      temp2 = temp2->next;
      temp = temp->next;
    }
  } else {
    head = nullptr;
  }
}

위의 코드는 연결된 목록 개체 const LinkedList &obj를 매개 변수로 받아들이고 수신된 연결 목록의 모든 데이터를 호출 연결 목록에 복사하는 Singly Linked List 복사 생성자를 보여줍니다.

Linked List는 Node 유형 포인터를 사용하므로 딥 카피를 위한 복사 생성자를 정의해야 합니다. 복사 생성자에 대한 구현이 제공되지 않으면 얕은 복사본이 생성됩니다.

복사 생성자 호출

main() 함수의 다음 코드를 고려하십시오.

int main() {
  LinkedList list;  // Declaring a List
  list.addNewItem(5);
  list.addNewItem(10);
  list.addNewItem(15);
  cout << "The content of List 1 are: ";
  list.display();

  LinkedList list2(list);  // Declaring a list2 with the copy constructor
  cout << "The content of List 2 are: ";
  list2.display();
  return 0;
}

위의 코드에서 LinkedList 유형 개체 목록LinkedList 목록을 사용하여 생성됩니다. 성명. 그런 다음 list.addNewItem( ) 메서드를 사용하여 세 개의 값을 목록에 삽입했습니다.

LinkedList 유형의 또 다른 list2 객체가 생성되고 복사 생성자를 호출하기 위해 선언 시 첫 번째 list 객체를 매개 변수로 전달했습니다. 두 개체의 display() 메서드는 목록에 동일한 데이터 항목을 표시합니다.

출력:

단일 연결 목록 복사 생성자 - 출력

관련 문장 - C++ Constructor