C++ 데이터 구조


C/C++ 배열을 사용하면 동일한 유형의 데이터 항목을 저장할 수 있는 변수를 정의할 수 있지만 구조는 C++에서 사용할 수 있는 또 다른 사용자 정의 데이터 유형으로, 다양한 유형의 데이터 항목을 저장할 수 있습니다.

구조는 레코드를 나타내는 데 사용됩니다. 도서관에 있는 책의 역학을 추적하고 싶다면 각 책의 다음 속성을 추적해야 할 수도 있습니다.

  • Title

  • Author

  • 제목

  • 책 ID

구조 정의

구조를 정의하려면 struct 문을 사용해야 합니다. struct 문은 여러 멤버를 포함하는 새로운 데이터 유형을 정의합니다.

struct [structure tag]
{
   member definition;
   member definition;
   ...
   member definition;
} [one or more structure variables];

구조 태그는 선택 사항이며 각 멤버 정의는 int i 또는 float f와 같은 표준 변수 정의입니다. ; 또는 기타 유효한 변수 정의. 구조 정의 끝에서 마지막 세미콜론 앞에 선택적으로 하나 이상의 구조 변수를 지정할 수 있습니다. Book 구조가 선언되는 방법은 다음과 같습니다.

struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
}book;

구조 멤버 액세스

구조 멤버에 액세스하려면 멤버 액세스 연산자(.)를 사용합니다. 멤버 액세스 연산자는 구조 변수 이름과 액세스하려는 구조 멤버 사이의 마침표입니다. struct 키워드를 사용하여 구조 유형의 변수를 정의할 수 있습니다. 다음 예에서는 구조체의 사용을 보여줍니다.

#include <iostream>
#include <cstring>
 
using namespace std;
 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main( )
{
   struct Books Book1;        // 声明 Book1,类型为 Book
   struct Books Book2;        // 声明 Book2,类型为 Book
 
   // Book1 详述
   strcpy( Book1.title, "Learn C++ Programming");
   strcpy( Book1.author, "Chand Miyan"); 
   strcpy( Book1.subject, "C++ Programming");
   Book1.book_id = 6495407;

   // Book2 详述
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Yakit Singha");
   strcpy( Book2.subject, "Telecom");
   Book2.book_id = 6495700;
 
   // 输出 Book1 信息
   cout << "Book 1 title : " << Book1.title <<endl;
   cout << "Book 1 author : " << Book1.author <<endl;
   cout << "Book 1 subject : " << Book1.subject <<endl;
   cout << "Book 1 id : " << Book1.book_id <<endl;

   // 输出 Book2 信息
   cout << "Book 2 title : " << Book2.title <<endl;
   cout << "Book 2 author : " << Book2.author <<endl;
   cout << "Book 2 subject : " << Book2.subject <<endl;
   cout << "Book 2 id : " << Book2.book_id <<endl;

   return 0;
}

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.

Book 1 title : Learn C++ Programming
Book 1 author : Chand Miyan
Book 1 subject : C++ Programming
Book 1 id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Yakit Singha
Book 2 subject : Telecom
Book 2 id : 6495700

함수 매개변수로서의 구조체

구조체를 함수 매개변수로 사용할 수 있으며, 매개변수 전달 방법은 다른 Type 변수와 동일하거나 포인터가 유사합니다. 위 예의 방식을 사용하여 구조 변수에 액세스할 수 있습니다.

#include <iostream>
#include <cstring>
 
using namespace std;
void printBook( struct Books book );

struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main( )
{
   struct Books Book1;        // 声明 Book1,类型为 Book
   struct Books Book2;        // 声明 Book2,类型为 Book
 
   // Book1 详述
   strcpy( Book1.title, "Learn C++ Programming");
   strcpy( Book1.author, "Chand Miyan"); 
   strcpy( Book1.subject, "C++ Programming");
   Book1.book_id = 6495407;

   // Book2 详述
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Yakit Singha");
   strcpy( Book2.subject, "Telecom");
   Book2.book_id = 6495700;
 
   // 输出 Book1 信息
   printBook( Book1 );

   // 输出 Book2 信息
   printBook( Book2 );

   return 0;
}
void printBook( struct Books book )
{
   cout << "Book title : " << book.title <<endl;
   cout << "Book author : " << book.author <<endl;
   cout << "Book subject : " << book.subject <<endl;
   cout << "Book id : " << book.book_id <<endl;
}

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.

Book title : Learn C++ Programming
Book author : Chand Miyan
Book subject : C++ Programming
Book id : 6495407
Book title : Telecom Billing
Book author : Yakit Singha
Book subject : Telecom
Book id : 6495700

구조에 대한 포인터

구조에 대한 포인터를 정의할 수 있습니다. 아래와 같이 다른 유형의 변수에 대한 포인터를 정의합니다.

struct Books *struct_pointer;

이제 위에서 정의한 포인터 변수에 구조 변수의 주소를 저장할 수 있습니다. 구조체 변수의 주소를 찾으려면 아래와 같이 구조체 이름 앞에 & 연산자를 넣으세요.

struct_pointer = &Book1;

구조체에 대한 포인터를 사용하여 구조체 멤버에 액세스하려면 -를 사용해야 합니다. > 연산자, 아래와 같이 :

struct_pointer->title;

구조 포인터를 사용하여 위의 예를 다시 작성해 보겠습니다. 이는 구조 포인터의 개념을 이해하는 데 도움이 됩니다.

#include <iostream>
#include <cstring>
 
using namespace std;
void printBook( struct Books *book );

struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main( )
{
   struct Books Book1;        // 声明 Book1,类型为 Book
   struct Books Book2;        // 声明 Book2,类型为 Book */
 
   // Book1 详述
   strcpy( Book1.title, "Learn C++ Programming");
   strcpy( Book1.author, "Chand Miyan"); 
   strcpy( Book1.subject, "C++ Programming");
   Book1.book_id = 6495407;

   // Book2 详述
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Yakit Singha");
   strcpy( Book2.subject, "Telecom");
   Book2.book_id = 6495700;
 
   // 通过传 Book1 的地址来输出 Book1 信息
   printBook( &Book1 );

   // 通过传 Book2 的地址来输出 Book2 信息
   printBook( &Book2 );

   return 0;
}
// 该函数以结构指针作为参数
void printBook( struct Books *book )
{
   cout << "Book title : " << book->title <<endl;
   cout << "Book author : " << book->author <<endl;
   cout << "Book subject : " << book->subject <<endl;
   cout << "Book id : " << book->book_id <<endl;
}

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다. :

Book title : Learn C++ Programming
Book author : Chand Miyan
Book subject : C++ Programming
Book id : 6495407
Book title : Telecom Billing
Book author : Yakit Singha
Book subject : Telecom
Book id : 6495700

typedef 키워드

다음은 구조를 정의하는 더 간단한 방법입니다. 생성한 유형에 "별칭"을 지정할 수 있습니다. 예:

typedef struct
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
}Books;

이제 struct 키워드를 사용하지 않고 Books를 직접 사용하여 Books 유형의 변수를 정의할 수 있습니다. 예는 다음과 같습니다.

Books Book1, Book2;

typedef 키워드를 사용하여 다음과 같이 비구조적 유형을 정의할 수 있습니다.

typedef long int *pint32;
 
pint32 x, y, z;

x, y 및 z는 모두 long int에 대한 포인터입니다.