C++에서 템플릿을 사용한 연결 리스트

Jay Shaw 2023년10월12일
  1. C++에서 템플릿을 사용한 연결 리스트
  2. .cpp 파일에서 템플릿을 사용하여 연결 목록 만들기
  3. 결론
C++에서 템플릿을 사용한 연결 리스트

템플릿은 사용할 데이터 유형이 문제일 때 생성되는 클래스 정의 데이터 유형입니다. 템플릿을 사용하면 데이터 유형에 유연하게 대처할 수 있고 컴파일 시간 동안 입력으로 제공된 데이터 유형만 사용할 수 있습니다.

이 기사에서는 C++에서 템플릿을 사용하여 연결 목록을 구성하는 방법에 대해 설명합니다.

C++에서 템플릿을 사용한 연결 리스트

이 기사는 헤더 파일(.h)에서 노드와 링크드 리스트 데이터를 추출하는 메인 파일(.cpp 파일)을 포함하는 3파트 프로그램을 제공합니다. 프로그램은 드라이버 메서드가 포함된 기본 파일을 통해 입력을 제공합니다.

먼저 템플릿을 사용하여 노드를 생성하는 방법을 이해합시다.

C++에서 템플릿 클래스 내부의 데이터 멤버 초기화

이것은 프로그램이 컴파일 중에 시작하는 첫 번째 헤더 파일입니다. 여기에 create_listInit의 두 가지 클래스가 정의되어 있습니다.

// file: init.h

#ifndef _INIT_H
#define _INIT_H

template <typename T>
class create_list;
template <typename T>
class Init {
  friend class create_list<T>;

 public:
  Init(T data = 0, Init<T> *next = 0) : data(data), next(next) { /* empty */
  }

 private:
  T data;
  Init<T> *next;
};

#endif

구문 template<typename T> class create_list; T 유형의 클래스를 생성합니다. 이것은 기본 데이터 유형이 제공될 때까지 T를 사용자 정의 데이터 유형으로 사용하도록 컴파일러에 지시합니다.

C++ 프로그램에서 템플릿을 사용하면 사용자 정의 데이터 유형을 사용하여 변수를 정의하는 흥미로운 기능이 제공됩니다. 마찬가지로 메소드는 데이터 유형으로 정의할 수 있으므로 프로그래머에게 유용한 도구입니다.

friend class create_list<T>; 구문 사용 컴파일러가 create_list 클래스를 친구 클래스로 태그하도록 지시합니다. 친구 클래스는 이 헤더 파일에서 공유되는 비공개 및 공개 멤버를 가져옵니다.

create_list 클래스가 정의되면 Init 클래스가 T 유형으로 생성됩니다.

컴파일러가 friend class create_list<T>; 구문을 실행할 때 이 클래스의 헤더 파일 create_list.h에서 private 및 public 멤버를 사용하도록 컴파일러에 지시합니다.

C++에서 템플릿을 사용하여 연결 목록을 생성하려면 두 가지 주요 변수, 즉 입력 값을 저장하는 데이터 변수와 다음 포인터를 가리키는 노드 변수가 필요합니다.

이 프로그램에서 이 두 가지 주요 변수는 datanext로 정의됩니다. 그런 다음 생성자의 private 및 public 멤버는 작업이 수행되기 전에 기본값을 사용하여 초기화됩니다.

마지막으로 public 생성자의 멤버 변수는 private 생성자의 멤버 변수로 초기화됩니다.

C++에서 템플릿을 사용하여 클래스 연결 목록 만들기

이 섹션에서는 이 문서의 세 부분 중 두 번째 부분에 대해 설명합니다. 여기에서 설명하는 프로그램은 #include "init.h" 구문을 사용하여 init.h 헤더 파일을 가져오고 해당 데이터 멤버를 사용하여 C++의 템플릿을 사용하여 연결 목록을 만듭니다.

템플릿 클래스 create_list 내부에는 생성자 create_list(), 소멸자 ~create_list(), 두 개의 멤버 메서드 void insert()void display()의 네 가지 공개 멤버가 있습니다.

두 개의 private 멤버, 포인터 *up*down이 데이터 유형 T와 함께 정의됩니다. 이 클래스 정의 데이터 유형을 사용하면 프로그램이 드라이버 프로그램의 모든 데이터 유형을 사용할 수 있으므로 프로그래머가 소스 코드로 되돌아가는 것을 방지할 수 있습니다. 물건을 수정합니다.

포인터 변수 head와 tail은 create_list 생성자 내에서 초기화됩니다.

template <typename T>
create_list<T>::create_list() : up(0), down(0)

소멸자 ~create_list() 내부에 메모리에 저장된 객체가 해제됩니다.

여기에서 up 객체 안에 값이 저장되어 있으면 포인터 *a 안에 복사됩니다. 포인터 *b에는 0 값이 지정됩니다.

포인터 변수 head와 tail은 create_list 생성자 내에서 초기화됩니다.

template <typename T>
create_list<T>::~create_list() {
  if (up) {
    Init<T> *a = up;
    Init<T> *b = 0;

a에 값이 있는 횟수만큼 b에 복사되어 변수 a 내의 개체에 대한 자리 표시자 역할을 합니다. 그러면 a에 다음 포인터 안에 저장된 값이 주어지고, 결국 b 안의 값이 해제됩니다.

while (a) {
  b = a;
  a = a->next;
  delete b;
}

연결 목록 내부에 값을 추가하는 방법

프로그램의 이 부분은 정보를 매개변수로 받는 클래스 유형이 T인 메서드를 만듭니다. 메서드 내에서 if-else 조건이 제공됩니다.

down 변수는 다음 포인터를 가리키는 데 사용됩니다. 여기에서 if 조건은 up 변수가 비어 있지 않은 경우 매개변수 정보에서 새 개체를 만들고 변수 down으로 전송하는지 확인합니다.

else 조건 내에서 변수 up에는 value 매개변수에서 생성된 개체인 down 값이 지정됩니다.

template <typename T>
void create_list<T>::insert(T value) {
  if (up) {
    down->next = new Init<T>(value);
    down = down->next;
  } else {
    up = down = new Init<T>(value);
  }
}

연결 목록 내부의 값을 인쇄하는 방법

이 메서드는 연결 목록의 내용을 인쇄합니다. up 변수 내부의 포인터 값은 *a 변수에 복사됩니다.

주어진 포인터 a에 값이 있는 횟수만큼 while 루프는 이를 인쇄한 다음 aup 포인터로 이동합니다.

template <typename T>
void create_list<T>::display() {
  if (up) {
    Init<T> *a = up;

    while (a) {
      cout << a->data << "->";
      a = a->next;
    }

아래 섹션은 C++ 템플릿을 사용하여 연결 목록을 만드는 코드를 보여줍니다.

// file createlist.h

#ifndef _CREATELIST_H
#define _CREATELIST_H

#include <iostream>
using namespace std;

#include "init.h"

template <typename T>
class create_list {
 public:
  create_list();
  ~create_list();
  void insert(T);
  void display();

 private:
  Init<T> *up;
  Init<T> *down;
};

#endif

template <typename T>
create_list<T>::create_list() : up(0), down(0) { /* empty */
}

template <typename T>
create_list<T>::~create_list() {
  if (up) {
    Init<T> *a = up;
    Init<T> *b = 0;

    while (a) {
      b = a;
      a = a->next;
      delete b;
    }

    cout << endl;
  }
}

template <typename T>
void create_list<T>::insert(T value) {
  if (up) {
    down->next = new Init<T>(value);
    down = down->next;
  } else {
    up = down = new Init<T>(value);
  }
}

template <typename T>
void create_list<T>::display() {
  if (up) {
    Init<T> *a = up;

    while (a) {
      cout << a->data << "->";
      a = a->next;
    }

    cout << endl;
  }
}

.cpp 파일에서 템플릿을 사용하여 연결 목록 만들기

이것은 프로그램의 마지막 부분입니다. 여기에는 create_list 헤더 파일이 포함되어 있으며 주요 기능이 생성됩니다.

연결 목록 템플릿의 데이터 유형은 메인 함수 내에서 설정됩니다. 여기에서 char는 주어진 for 루프 내 숫자의 ASCII 값을 인쇄하는 데 사용됩니다.

for 루프는 10번 실행되고 65에서 75까지의 ASCII 값, A에서 J까지의 문자를 인쇄합니다. list.insert(i); 구문은 i의 값을 메서드 add에 전달하고 연결 목록에 삽입된 다음 다른 값이 전달됩니다.

마지막으로 list.display(); 연결 리스트의 내용을 출력합니다.

// file run.cpp

#include "create_list.h"

int main(int argc, char *argv[]) {
  create_list<char> created_list;
  for (char i = 65; i < 75; i++) created_list.insert(i);
  created_list.display();

결론

이 문서에서는 C++에서 템플릿을 사용하여 연결 목록을 만드는 방법에 대해 자세히 설명합니다. 기사를 다 읽고 나면 독자는 사용자 정의 데이터 유형으로 프로그램을 만들고 여러 데이터 유형이 있는 연결 목록을 한 번에 사용할 수 있습니다.

관련 문장 - C++ Linked List