Strutture dati C ++

Gli array C / C ++ consentono di definire variabili che combinano diversi elementi di dati dello stesso tipo, ma structure è un altro tipo di dati definito dall'utente che consente di combinare elementi di dati di diversi tipi.

Le strutture vengono utilizzate per rappresentare un record, supponiamo di voler tenere traccia dei tuoi libri in una libreria. Potresti voler monitorare i seguenti attributi di ogni libro:

  • Title
  • Author
  • Subject
  • ID libro

Definizione di una struttura

Per definire una struttura, è necessario utilizzare l'istruzione struct. L'istruzione struct definisce un nuovo tipo di dati, con più di un membro, per il programma. Il formato dell'istruzione struct è questo:

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

Il structure tagè opzionale e ogni definizione di membro è una normale definizione di variabile, come int i; o float f; o qualsiasi altra definizione di variabile valida. Alla fine della definizione della struttura, prima del punto e virgola finale, è possibile specificare una o più variabili di struttura ma è opzionale. Ecco il modo in cui dichiareresti la struttura del libro:

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

Accesso ai membri della struttura

Per accedere a qualsiasi membro di una struttura, utilizziamo il member access operator (.). L'operatore di accesso ai membri è codificato come un periodo tra il nome della variabile di struttura e il membro della struttura a cui si desidera accedere. Userestistructparola chiave per definire variabili di tipo struttura. Di seguito è riportato l'esempio per spiegare l'uso della struttura:

#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;        // Declare Book1 of type Book
   struct Books Book2;        // Declare Book2 of type Book
 
   // book 1 specification
   strcpy( Book1.title, "Learn C++ Programming");
   strcpy( Book1.author, "Chand Miyan"); 
   strcpy( Book1.subject, "C++ Programming");
   Book1.book_id = 6495407;

   // book 2 specification
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Yakit Singha");
   strcpy( Book2.subject, "Telecom");
   Book2.book_id = 6495700;
 
   // Print Book1 info
   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;

   // Print Book2 info
   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;
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

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

Strutture come argomenti di funzione

Puoi passare una struttura come argomento di una funzione in modo molto simile quando passi qualsiasi altra variabile o puntatore. Accederesti alle variabili di struttura nello stesso modo in cui hai avuto accesso nell'esempio precedente:

#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;        // Declare Book1 of type Book
   struct Books Book2;        // Declare Book2 of type Book
 
   // book 1 specification
   strcpy( Book1.title, "Learn C++ Programming");
   strcpy( Book1.author, "Chand Miyan"); 
   strcpy( Book1.subject, "C++ Programming");
   Book1.book_id = 6495407;

   // book 2 specification
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Yakit Singha");
   strcpy( Book2.subject, "Telecom");
   Book2.book_id = 6495700;
 
   // Print Book1 info
   printBook( Book1 );

   // Print Book2 info
   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;
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

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

Puntatori alle strutture

Puoi definire puntatori a strutture in modo molto simile mentre definisci puntatore a qualsiasi altra variabile come segue:

struct Books *struct_pointer;

Ora è possibile memorizzare l'indirizzo di una variabile di struttura nella variabile puntatore definita sopra. Per trovare l'indirizzo di una variabile di struttura, inserire l'operatore & prima del nome della struttura come segue:

struct_pointer = &Book1;

Per accedere ai membri di una struttura utilizzando un puntatore a quella struttura, è necessario utilizzare l'operatore -> come segue:

struct_pointer->title;

Riscriviamo l'esempio sopra usando il puntatore della struttura, spero che questo ti sia facile da capire il concetto -

#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;        // Declare Book1 of type Book
   struct Books Book2;        // Declare Book2 of type Book
 
   // Book 1 specification
   strcpy( Book1.title, "Learn C++ Programming");
   strcpy( Book1.author, "Chand Miyan"); 
   strcpy( Book1.subject, "C++ Programming");
   Book1.book_id = 6495407;

   // Book 2 specification
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Yakit Singha");
   strcpy( Book2.subject, "Telecom");
   Book2.book_id = 6495700;
 
   // Print Book1 info, passing address of structure
   printBook( &Book1 );

   // Print Book1 info, passing address of structure
   printBook( &Book2 );

   return 0;
}

// This function accept pointer to structure as parameter.
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;
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

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

La parola chiave typedef

C'è un modo più semplice per definire le strutture o puoi "alias" i tipi che crei. Ad esempio:

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

Ora puoi usare Libri direttamente per definire variabili di tipo Libri senza usare la parola chiave struct. Di seguito è riportato l'esempio:

Books Book1, Book2;

Puoi usare typedef parola chiave per non-struct così come segue:

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

x, yez sono tutti puntatori a interi lunghi.